Java 和 Python 代码给出不同的输出?
Java and Python codes give different output?
这是 Java 代码结果 897986030
:
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);
}
}
这是等效的 Python 代码输出 480330031
:
factor = 900414279
p1 = 883069911
p2 = 32;
val = 560076994;
mod = 1000000007;
val = (val%mod+factor*p1*p2%mod)%mod;
print val
请帮忙。谢谢!
答案在于您在 java 中使用了容易溢出的原始类型。
如果您还不了解这个概念,请让我解释一下。在 java 中,C、C++ 等原始类型为其分配了一定数量的 space,并且变量不能使用超过此数量的任何 space。这意味着 long
数据类型可以存储的最大数量。这样做是出于性能原因。
上面代码中可能发生的情况是,当您将两个 long
值相乘时,结果可能会变得大于 long
数据类型可以存储的最大值。这会导致溢出,导致数据变窄。所以数学表达式的结果是乱七八糟的。
对于 Python 这不是什么大问题,因为 Python 可以存储更大范围的数字。溢出在 Python 中很少见。这就是为什么使用大数字的密码应用程序之类的东西很容易写成 Python.
这是 Java 代码结果 897986030
:
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);
}
}
这是等效的 Python 代码输出 480330031
:
factor = 900414279
p1 = 883069911
p2 = 32;
val = 560076994;
mod = 1000000007;
val = (val%mod+factor*p1*p2%mod)%mod;
print val
请帮忙。谢谢!
答案在于您在 java 中使用了容易溢出的原始类型。
如果您还不了解这个概念,请让我解释一下。在 java 中,C、C++ 等原始类型为其分配了一定数量的 space,并且变量不能使用超过此数量的任何 space。这意味着 long
数据类型可以存储的最大数量。这样做是出于性能原因。
上面代码中可能发生的情况是,当您将两个 long
值相乘时,结果可能会变得大于 long
数据类型可以存储的最大值。这会导致溢出,导致数据变窄。所以数学表达式的结果是乱七八糟的。
对于 Python 这不是什么大问题,因为 Python 可以存储更大范围的数字。溢出在 Python 中很少见。这就是为什么使用大数字的密码应用程序之类的东西很容易写成 Python.