我正在尝试解决以下问题
您应该计算前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);
问题在此行中
(input * (input + 1) / 2)*(input * (input + 1) / 2) - (input * (input + 1)) * ((input * 2) + 1) / 6
4094574264是一个33位带符号的数字,因此input * (input + 1)
将需要66位进行存储,这会溢出64位long
。以后不计算乘法序列,导致结果远大于64位。
如果要执行这种高精度算术,请改用BigInteger
您,我的朋友,正在遇到BigInteger
。这是因为没有足够的位数来描述您想要解释的数字,所以您最终陷入了一个大循环(因此为负数)。
如果您希望使用难以置信的大数字,解决方案是使用overflow和BigInteger
类。这些旨在创建任意精度数字。
低级答案:
答案是否定的,因为您遇到溢出。 JVM最多只能表示一个特定值(该类型的最大值)的数字。如果执行任何将值增加到超过最大值的操作,它将“溢出”机器的表示能力并完全更改该数字。在您的情况下,为负值。相反的情况适用于负数:如果我将负数减小到最小值以下,它将“向下流动”,并且我将得到很大的正数答案。使用BigInteger(BigDecimal
)进行“大型数学运算”。