Java和Python代码提供不同的输出?

时间:2016-03-08 03:36:30

标签: rounding long-integer biginteger modulus

这是导致897986030 Java 代码:

import java.util.Arrays;
import java.util.Scanner;

class Algorithm {
    public static void main(String args[]) throws Exception {
        int mod = 1000000007;
        long factor  = 900414279;
        long p1 = 883069911;
        long p2 = 32;
        long val = 560076994;
        val = (val%mod+factor*p1*p2%mod)%mod;
        System.out.println(val);
    }
}

这是输出480330031的等效 Python 代码:

factor  = 900414279
p1 = 883069911
p2 = 32;
val = 560076994;
mod = 1000000007;
val = (val%mod+factor*p1*p2%mod)%mod;
print val

请帮忙。谢谢!

1 个答案:

答案 0 :(得分:1)

答案在于你在java中使用容易出现溢出的原始类型。

让我解释一下你是否已经意识到这个概念。在java,C,C ++和类似原始类型中为它们分配了一定的空间,并且变量不能使用任何空间。这意味着long数据类型可以存储的最大数量。这是出于性能原因而完成的。

上面代码中可能发生的情况是,当您将两个long值相乘时,结果可能会大于long数据类型可以存储的最大值。这会导致溢出,导致数据变窄。所以数学表达式的结果搞砸了。

使用Python这不是一个问题,因为Python可以存储更大范围的数字。 Python中很少出现溢出。这就是为什么像使用大数字的加密应用程序这样的东西很容易用Python编写。