在C(1秒以内)中是否有任何快速方法可以找到两个数字之间的完美平方数。 对于前者对于1 - < - > 10我们有2个完美的正方形4和9.但是在1< - > 2 ^ 60或其他更大的数字之间呢。
这很慢
while(i*i<=n)
{
sum+=i==((long long)(sqrt(i*i)));
i++;
}
其中n是2 ^ 60,我们从i = 2开始。
答案 0 :(得分:41)
x = (int)sqrt(n2) - (int)sqrt(n1);
答案 1 :(得分:12)
它的微不足道。假设您有两个端点,a&amp; b,a&lt;湾
之后的下一个完美广场是什么?提示,什么是sqrt(a)?会怎样做?
什么是最大的完美广场,不超过b?提示,什么是sqrt(b)?再次,舍入如何帮助?
一旦你知道这两个数字,计算完美正方形的数量似乎真的微不足道。
顺便说一下,小心点。即使是2 ^ 60的sqrt也是一个很大的数字,尽管它会适合双倍。问题是2 ^ 60太大而不适合标准双,因为它超过2 ^ 53。所以要注意精确度问题。
答案 2 :(得分:5)
floor(sqrt(b)) - ceil(sqrt(a)) + 1
给出从a
到b
的区间内的完美平方数。
答案 3 :(得分:0)
if(n1 is a perfect square)
x=(int)sqrt(n2)-(int)sqrt(n1)+1;
else
x=(int)sqrt(n2)-(int)sqrt(n1);
答案 4 :(得分:0)
与语言无关的公式,只要标准lib提供基本的数学函数sqrt,ceil和floor,即可获得[a,b]范围内的完美平方数。
cnt = int(floor(sqrt(b))) - int(ceil(sqrt(a))) + 1