我需要找到一種有效的方法來將多頭平方最多 10^13。我在 Java 中有以下代碼:
static boolean squarefree(long number) {
for (int i = 2; i <= number; i ) {
if (number % (i*i) == 0) {
return false;
}
}
return true;
}
這將回傳除以零錯誤,但i在任何時候都不為零,所以我不確定為什么會出現該錯誤。我沒有使用的原因Math.pow(i ,2)是因為我覺得它會比僅將數字乘以本身要慢得多。

有誰知道為什么會發生這個錯誤,或者我如何有效地平方數
uj5u.com熱心網友回復:
您正在遇到Integer Overflow。
下面的函式解決了這個問題。
static boolean isSquareFree(long number) {
long upperLimit = (long) Math.sqrt(number);
for (long i = 2; i <= upperLimit; i ) {
if (number % (i*i) == 0) {
return false;
}
}
return true;
}
演算法解釋
我們試圖確定一個數字是否為squarefree。
其平方完美整除數 (n) 的最大整數 (i) 可以表示為
i = floor(sqrt(n))
例如,81 = 9^2。
因此檢查 uptoupperLimit = (long) Math.sqrt(number)就足夠了。
現在,
由于upperLimit小于或等于 的平方根number,適合資料型別long,
我們可以放心,它的平方也適合型別long。
因此,我們不會再有Integer Overflow 了。
uj5u.com熱心網友回復:
當您number大于Integer.MAX_VALUE那時您的回圈將永遠不會退出。
不好的是,i會溢位到Integer.MIN_VALUE( Integer.MAX_VALUE 1 == Integer.MIN_VALUE) 并從那里開始0從負方向接近(由于i )。
一旦它達到零,i * i仍然會產生0,這就是為什么你會得到那個例外。
如評論中所述,更改int i為long i可能會解決該問題。當您開始處理更大的數字時,您可能不得不求助于 usingBigInteger或其他一些演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374610.html
上一篇:3D圖形中主要使用哪種旋轉技術
