Java中针对Python的同一函数的不同输出
我有一个计算公式Java中针对Python的同一函数的不同输出,java,python,Java,Python,我有一个计算公式 ((x+y-1)*(x+y-2))/2 + x 并获取它的字符串表示形式。 因此,我在Java1.7中编写 public static void main(String[] args) { int x = 99999; int y = 99999; int answer = ((x+y-1)*(x+y-2))/2 + x; String s = Integer.toString(answer); System.out.println(
((x+y-1)*(x+y-2))/2 + x
并获取它的字符串表示形式。
因此,我在Java1.7中编写
public static void main(String[] args)
{
int x = 99999;
int y = 99999;
int answer = ((x+y-1)*(x+y-2))/2 + x;
String s = Integer.toString(answer);
System.out.println(s);
}
在Python2.7中
def answer(x, y):
z = ((x+y-1)*(x+y-2))/2 + x
return str(z);
print(answer(99999,99999))
Java给了我
672047173
的输出,而Python给了我19999400005
,并且Python的值似乎是正确的。这种差异背后的原因是什么 19999400005
对于int
变量的值太大,因此Java计算将溢出
改用long
变量:
public static void main(String[] args)
{
long x = 99999;
long y = 99999;
long answer = ((x+y-1)*(x+y-2))/2 + x;
String s = Long.toString(answer);
System.out.println(s);
}
输出为:
19999400005
还请注意,您可以直接打印答案
,而不必显式地将其转换为字符串
:
System.out.println(answer);
因为java中的整数范围最小值为-2147483648,最大值为2147483647 int-answer=((x+y-1)*(x+y-2))/2+x 在这一行中,您将为整数指定更高的范围值。它会导致算术运算出现整数溢出。这就是为什么要得到正确的值,必须使用Long数据类型
public static void main(String[] args)
{
int x = 99999;
int y = 99999;
long answer = (((x+y-1)*1l)*((x+y-2)*1l))/2 + x;
String s = Long.toString(answer);
System.out.println(s);
}
在这种情况下,Java计算肯定会溢出。这仍然不起作用
int*int
在int
中给出结果,然后将其分配给long
,这样您仍然可以得到受整数溢出影响的答案。如果您想对整数执行相同的操作
您可以按1L*(x+y-1)*(x+y-2)
执行long
中的乘法操作。您在这里错了。乘法运算后将执行隐式转换,乘法将以整数数据类型执行,这将导致溢出并给出错误答案。您可以通过运行代码段进行检查。