2012-01-19 11 views
10

2つの数字の間の完全な正方形の数を見つけるためにC(1秒以下)に速い方法がありますか? 例: 1 < - > 10の場合、2つの完全な正方形4と9があります。しかし、1 < - > 2^60の間ではどうなりますか?2つの数字の間の完全な正方形

これは、nがある

while(i*i<=n) 
{ 
    sum+=i==((long long)(sqrt(i*i))); 
    i++; 
} 

は2^60言うと、我々は、I = 2で始めることができます遅いです。

+8

*、486又は560のGeForce? –

+2

なぜ、2^30 - 1?エンドポイントの 'sqrt'を計算し、その範囲内にある整数の数を調べることはできますか? –

答えて

41
x = (int)sqrt(n2) - (int)sqrt(n1); 
+0

[9,10] – amit

+2

@amitに1つの完全な正方形があります。例(1 <-> 10が2)によって、下限は排他的です。 –

+0

それが+1です。 – amit

12

些細なことです。 2つのエンドポイント、& b、< bがあるとします。

  1. aの後の次の完全な正方形は何ですか?ヒント、sqrt(a)とは何ですか?切り上げるのは何ですか?

  2. bを超えない最大の正方形は何ですか?ヒント、sqrt(b)とは何ですか?繰り返しますが、丸めはここでどのように役立ちますか?

これらの2つの数字が分かれば、完全な正方形の数を数えることは本当に些細なことです。

ところで、注意してください。 2^60のsqrtでも倍数に収まるものの、大きな数です。問題は、2^60が大きすぎて標準の倍精度に収まらないことです。これは2^53を超えているためです。だから、精密な問題に注意してください。

+0

+素敵なトリック、ありがとう! –

0
if(n1 is a perfect square)  
    x=(int)sqrt(n2)-(int)sqrt(n1)+1; 
else 
    x=(int)sqrt(n2)-(int)sqrt(n1);