4 回答
TA贡献1842条经验 获得超21个赞
n当超过 a 可以容纳的值时,您会得到奇怪的结果long,即Math.pow(2, 63) == Long.MAX_VALUE。到那时,n就会出现数值溢出。
final long l = Long.MAX_VALUE; // == 2^63
System.out.println(l); // 9223372036854775807
System.out.println(l + 1); // -9223372036854775808
TA贡献1836条经验 获得超4个赞
当甚至超过 type 的范围时,由于算术溢出,您会得到大值的随机错误。您应该为所有整数变量使用 type以减少这种可能性,并确保中间结果不超过 type 的范围。intMath.cbrt(a3)Math.cbrt(n - a3)intlonglong
这是一个使用单个循环的更简单的实现,计算方式的数量:
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条经验 获得超11个赞
问题在于乘以a and c
类型变量int
来计算立方体。需要将cast
每个变量long
乘以。
例子, a3 = (long) a * (long) a * (long) a;
TA贡献1799条经验 获得超6个赞
long 可以容纳的最大数字(在 Java 中)是 (2 ^ 63) - 1 (Long.MAX_VALUE)。你为什么要计算 Math.cbrt(a3) ?如果 a3 = a * a * a,那么您已经知道 Math.cbrt(a3) 是什么。
如果 n > 9223372036854774272 Math.cbrt of 9223372036854774273 是 2097152 并且如果你立方体你因为溢出而得到负数,那么你的代码有问题。
添加回答
举报