在projectEuler.net网站的一个问题(第6号)中,我们必须找到n个数的总和与平方数的总和的平方差。这很容易,但我无法想到如何在输入非常大时找到它。
例如当n = 1000时,我的java程序给了我一个奇怪的答案,这是负面的。那么,有人可以帮我解决这个问题吗?
很抱歉没有提交我的代码。但是在我的代码中我也使用了长数据类型,但它仍然溢出。
我的代码如下:
package projectEuler;
import java.util.Scanner;
public class Problem6{
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int t=input.nextInt();
int n;
long a,b;
while(t-->0){
n=input.nextInt();
a=((n*n*(n+1)*(n+1))/4);
b=((n*(n+1)*(2*n+1))/6);
System.out.println("sigma n^3 is "+a);
System.out.println("sigma n^2 is "+b);
//diff=(((n*n*(n+1)*(n+1))/4)-((n*(n+1)*(2*n+1))/6));
System.out.println((a-b));
}
}
}
答案 0 :(得分:1)
您需要n
long
,而不仅仅是a
和b
。否则,表达式(n*n*(n+1)*(n+1))/4
将在您将其分配给a
之前溢出。这是因为int * int
总是会得到int
结果,即使乘法结果太大而无法分配给int
。
答案 1 :(得分:0)
int :最大值为2,147,483,647
长:最高价值为9,223,372,036,854,775,807
您正在达到最大整数值,因此这是一个溢出错误。
使用long而不是int。
答案 2 :(得分:0)
如果您的要求不适合任何原始数据类型,您可以使用 BigInteger , BigDecimal