- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经给出了范围 L 到 R。我必须找出 L 到 R 之间有多少个数字,这样数字的除数为奇数。
1<L<R<10^18
由于L和R相当高,所以简单的for循环会导致超时。
我发现二分搜索可以用来解决这个问题。
我不明白二分搜索如何帮助找到奇数个数的计数除数。
代码:
int find (long long n) {
int low,high,mid;
long long v1,v2;
low = 1;
high = 1e9 + 1;
if (n == 0) {
return 0;
}
while (low <= high) {
mid = (low + high) / 2;
v1 = mid * 1LL * mid;
v2 = (mid + 1) * 1LL * (mid + 1);
if (v1 <= n) {
if (v2 > n) {
return mid;
} else {
low = mid + 1;
}
} else {
high = mid - 1;
}
}
}
和
答案:ans = find(r) - find(l - 1);
请解释一下数论中二分查找的概念
最佳答案
该算法基于一个简单的事实,即为了得到奇数个除数,数字 n
必须是一个完整的正方形。否则,对于每个除数 k
,还有另一个不同的除数 n/k
,因此您将始终拥有偶数个除数。该算法只计算 1
和提供的 n
(含)之间的完整方 block 数,这实际上是 integer square root (floor(sqrt(n))
)。所以它使用二进制搜索找到平方根。如果你的平台/语言上有足够精确的 sqrt(n)
方法,你可以这样解决你的问题:
ans = floor(sqrt(r)) - floor(sqrt(l-1));
通常 double
类型不能提供足够的精度,因此结果可能少一或多一。可能这就是使用二分查找的原因。尽管如此,您仍然可以使用 sqrt
。之后只需计算平方,如有必要,将结果调整一(这样会快得多)。或者,您可以使用牛顿法(调整后它比 sqrt
慢,但比二进制搜索快得多)。
关于algorithm - 二分查找的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248978/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!