我正在尝试解决以下问题:
你应该计算前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);
答案 0 :(得分: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 :(得分:1)
你,我的朋友,正在经历overflow。这是因为没有足够的位来描述你想要解释的数字,所以你最终会绕过一个大循环(因此是负数)。
如果您希望使用难以置信的大数字,那么解决方案就是使用BigInteger
和BigDecimal
类。它们旨在创建任意精度数字。
答案 2 :(得分:0)
低级答案:
答案是否定的,因为您正在经历溢出。 JVM只能表示某个值(该类型的最大值)。如果执行任何增加超过最大值的操作,它将流过"机器的表示能力并完全改变了数字;在你的情况下,为负值。相反的情况适用于否定:如果我将负值减少到最小值以下,它将在"下流动。我会得到一个非常大的积极回答。使用BigInteger(https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html)进行"大数学。"