题解 | #完全平方数#
完全平方数
https://ac.nowcoder.com/acm/problem/14733
技巧
二分
思路
找到 1e9 范围内所有整数平方根数组 最大长度就是 根号1e9 + 1
二分查找范围l和r ,找到对应的索引。 计算差值个数。
实现
package main
import (
"bufio"
. "fmt"
"io"
"math"
"os"
)
func main() {
NC14733(os.Stdin, os.Stdout)
}
// https://ac.nowcoder.com/acm/problem/14733
func NC14733(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
// 构建满足 0 - 1000000000的整数平分根
maxNum := int(math.Sqrt(float64(1000000000)))
sqrtArr := make([]int, maxNum+1)
for i := 1; i <= maxNum; i++ {
sqrtArr[i] = i * i
}
// 参数输入
var n int
for Fscan(in, &n); n > 0; n-- {
var l, r int
Fscan(in, &l, &r)
// 二分查找
// >= l 的最左位置
li, ri := 0, len(sqrtArr)-1
for li <= ri {
mid := (li + ri) / 2
if sqrtArr[mid] >= l {
ri = mid - 1
} else {
li = mid + 1
}
}
lIndex := li
// <=r的最右位置
li, ri = 0, len(sqrtArr)-1
for li <= ri {
mid := (li + ri) / 2
if sqrtArr[mid] <= r {
li = mid + 1
} else {
ri = mid - 1
}
}
rIndex := ri
// 输出答案个数
Fprintln(out, rIndex-lIndex+1)
}
}
科大讯飞公司氛围 437人发布