4 回答

TA貢獻1842條經(jīng)驗 獲得超21個贊
n當超過 a 可以容納的值時,您會得到奇怪的結果long,即Math.pow(2, 63) == Long.MAX_VALUE。到那時,n就會出現(xiàn)數(shù)值溢出。
final long l = Long.MAX_VALUE; // == 2^63
System.out.println(l); // 9223372036854775807
System.out.println(l + 1); // -9223372036854775808

TA貢獻1836條經(jīng)驗 獲得超4個贊
當甚至超過 type 的范圍時,由于算術溢出,您會得到大值的隨機錯誤。您應該為所有整數(shù)變量使用 type以減少這種可能性,并確保中間結果不超過 type 的范圍。intMath.cbrt(a3)Math.cbrt(n - a3)intlonglong
這是一個使用單個循環(huán)的更簡單的實現(xiàn),計算方式的數(shù)量:
public class Ramanujan {
public static boolean isRamanujan(long n) {
if (n <= 0) return false;
int count = 0;
for (long a = 1;; a++) {
long a3 = a * a * a;
if (a3 > n - a3) break;
long b = (long)Math.cbrt(n - a3);
if (a3 + b * b * b == n) count++;
}
return count >= 2;
}
public static void main(String[] args) {
if (args.length == 1) {
long n = Long.parseLong(args[0]);
StdOut.println(isRamanujan(n));
} else
if (args.length == 2) {
long n1 = Long.parseLong(args[0]);
long n2 = Long.parseLong(args[1]);
for (long n = n1; n <= n2; n++) {
if (isRamanujan(n))
StdOut.println(n);
if (n == Long.MAX_VALUE) // handle n2 == Long.MAX_VALUE
break;
}
} else {
StdOut.println("usage: Ramanujan n1 [n2]");
}
}
}

TA貢獻1818條經(jīng)驗 獲得超11個贊
問題在于乘以a and c
類型變量int
來計算立方體。需要將cast
每個變量long
乘以。
例子, a3 = (long) a * (long) a * (long) a;

TA貢獻1799條經(jīng)驗 獲得超6個贊
long 可以容納的最大數(shù)字(在 Java 中)是 (2 ^ 63) - 1 (Long.MAX_VALUE)。你為什么要計算 Math.cbrt(a3) ?如果 a3 = a * a * a,那么您已經(jīng)知道 Math.cbrt(a3) 是什么。
如果 n > 9223372036854774272 Math.cbrt of 9223372036854774273 是 2097152 并且如果你立方體你因為溢出而得到負數(shù),那么你的代碼有問題。
添加回答
舉報