Java 如何处理大数字?

Java 如何处理大数字?,java,long-integer,biginteger,Java,Long Integer,Biginteger,我正在努力解决以下问题 您应该计算前n个整数的平方和与前n个整数的平方和之间的差 当我输入一个大数字(例如4094574264)时,答案是否定的。为什么?应该是正数 Scanner scan = new Scanner(System.in); long input = scan.nextLong(); long answer = (input * (input + 1) / 2)*(input * (input + 1) / 2) - (input * (input + 1)) * ((inpu

我正在努力解决以下问题

您应该计算前n个整数的平方和与前n个整数的平方和之间的差

当我输入一个大数字(例如4094574264)时,答案是否定的。为什么?应该是正数

Scanner scan = new Scanner(System.in);
long input = scan.nextLong();
long answer = (input * (input + 1) / 2)*(input * (input + 1) / 2) - (input * (input + 1)) * ((input * 2) + 1) / 6;
System.out.println(answer);

你,我的朋友,正在经历。这是因为没有足够的位来描述您想要解释的数字,所以您最终会在一个大循环中循环(因此是负数)


如果您希望使用非常大的数字,解决方案是使用
biginger
BigDecimal
类。这些设计用于创建任意精度的数字。

问题出在这一行

(input * (input + 1) / 2)*(input * (input + 1) / 2) - (input * (input + 1)) * ((input * 2) + 1) / 6
4094574264是一个33位带符号的数字,因此
input*(input+1)
需要66位来存储,这会溢出64位
。这还不包括以后的一系列乘法,结果远大于64位

如果你想做这种高精度的运算,请改用低级答案:


答案是否定的,因为您正在经历溢出。JVM只能表示不超过某个值(该类型的最大值)的数字。如果执行任何将值增加到最大值以上的操作,它会“溢出”机器的表示能力,并完全更改数字;在您的情况下,设置为负值。相反的情况适用于负数:如果我将负值减小到最小值以下,它将“向下流动”,我将得到一个非常大的正值。对“大数学”使用biginger()。

至少需要131位类型来计算上述表达式