两个数字之间的完美正方形

时间:2012-01-19 23:30:51

标签: c++ algorithm

在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开始。

5 个答案:

答案 0 :(得分:41)

x = (int)sqrt(n2) - (int)sqrt(n1);

答案 1 :(得分:12)

它的微不足道。假设您有两个端点,a&amp; b,a&lt;湾

  1. 之后的下一个完美广场是什么?提示,什么是sqrt(a)?会怎样做?

  2. 什么是最大的完美广场,不超过b?提示,什么是sqrt(b)?再次,舍入如何帮助?

  3. 一旦你知道这两个数字,计算完美正方形的数量似乎真的微不足道。

    顺便说一下,小心点。即使是2 ^ 60的sqrt也是一个很大的数字,尽管它会适合双倍。问题是2 ^ 60太大而不适合标准双,因为它超过2 ^ 53。所以要注意精确度问题。

答案 2 :(得分:5)

不要迭代。等式:

floor(sqrt(b)) - ceil(sqrt(a)) + 1

给出从ab的区间内的完美平方数。

https://en.wikipedia.org/wiki/Intermediate_value_theorem

答案 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