当计算能力增强时,Java和Python会产生不同的结果
我试图通过在projecteuler.net上解决问题来自学Java,就像我之前在Python上所做的那样。在尝试解决问题16时,我复制了以前在Python中使用的方法。但是,两种语言的结果输出不同。我认为这与Java数据类型不同于Python有关。问题是对数字2^1000中的数字求和 在Python中:当计算能力增强时,Java和Python会产生不同的结果,java,python,Java,Python,我试图通过在projecteuler.net上解决问题来自学Java,就像我之前在Python上所做的那样。在尝试解决问题16时,我复制了以前在Python中使用的方法。但是,两种语言的结果输出不同。我认为这与Java数据类型不同于Python有关。问题是对数字2^1000中的数字求和 在Python中: def sumdigits(n): s = 0 while n > 0: s = s + (n % 10) n = n / 10 return s print sumdi
def sumdigits(n):
s = 0
while n > 0:
s = s + (n % 10)
n = n / 10
return s
print sumdigits(pow(2,1000))
在Java中:
public static double SumDigits(double n){
double s = 0;
while (n > 0){
s = s + (n % 10);
n = n / 10;}
return s;
}
System.out.println(SumDigits(Math.pow(2,1000)));
Python生成了正确的结果,Java生成了1197.1463275484991
为什么它们会不同?Java中的基本数字类型是int和double。两者都不能处理1000位的数字。Python内置了一个任意大整数类型。对于Java,您必须找到另一种解决方案 在使用任意大整数算法的语言中,这个问题很简单
print sum(int(x) for x in str(2**1000))
如果你没有这个工具,你必须自己编写乘以2的代码。在Java中,不能准确地表示2^1000。作为一个浮点数,Math.pow(21000)
是1.0715086071862673E301
要获得所需的结果,请使用保留实际值2^1000的
public static BigInteger sumDigits(BigInteger n) {
BigInteger num = n;
BigInteger sum = BigInteger.ZERO;
BigInteger ten = BigInteger.valueOf(10);
while (num.compareTo(BigInteger.ZERO) > 0) {
sum = sum.add(num.mod(ten));
num = num.divide(ten);
}
return sum;
}
public static void main(String[] args) {
System.out.println(sumDigits(BigInteger.valueOf(2).pow(1000)));
}
上述代码的输出为
1366
,因为您使用的是双精度
?尝试使用整数类型。但是Math.pow(21000)超出了int类型的范围。您必须使用biginger
。