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で始めることができます遅いです。
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で始めることができます遅いです。
些細なことです。 2つのエンドポイント、& b、< bがあるとします。
aの後の次の完全な正方形は何ですか?ヒント、sqrt(a)とは何ですか?切り上げるのは何ですか?
bを超えない最大の正方形は何ですか?ヒント、sqrt(b)とは何ですか?繰り返しますが、丸めはここでどのように役立ちますか?
これらの2つの数字が分かれば、完全な正方形の数を数えることは本当に些細なことです。
ところで、注意してください。 2^60のsqrtでも倍数に収まるものの、大きな数です。問題は、2^60が大きすぎて標準の倍精度に収まらないことです。これは2^53を超えているためです。だから、精密な問題に注意してください。
+素敵なトリック、ありがとう! –
if(n1 is a perfect square)
x=(int)sqrt(n2)-(int)sqrt(n1)+1;
else
x=(int)sqrt(n2)-(int)sqrt(n1);
繰り返しはしないでください。式:
floor(sqrt(b)) - ceil(sqrt(a)) + 1
は包括的b
までa
からの間隔で完璧な正方形の数を示します。どのように1秒* 1秒以下
*、486又は560のGeForce? –
なぜ、2^30 - 1?エンドポイントの 'sqrt'を計算し、その範囲内にある整数の数を調べることはできますか? –