如何处理大数?

问题描述 投票:-1回答:3

我正在尝试解决以下问题

您应该计算前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);
java long-integer biginteger
3个回答
2
投票

问题在此行中

(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


1
投票

您,我的朋友,正在遇到BigInteger。这是因为没有足够的位数来描述您想要解释的数字,所以您最终陷入了一个大循环(因此为负数)。

如果您希望使用难以置信的大数字,解决方案是使用overflowBigInteger类。这些旨在创建任意精度数字。


0
投票

低级答案:

答案是否定的,因为您遇到溢出。 JVM最多只能表示一个特定值(该类型的最大值)的数字。如果执行任何将值增加到超过最大值的操作,它将“溢出”机器的表示能力并完全更改该数字。在您的情况下,为负值。相反的情况适用于负数:如果我将负数减小到最小值以下,它将“向下流动”,并且我将得到很大的正数答案。使用BigInteger(BigDecimal)进行“大型数学运算”。

© www.soinside.com 2019 - 2024. All rights reserved.