寻找一系列的总和

时间:2014-07-14 05:40:26

标签: java largenumber

在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));
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您需要n long,而不仅仅是ab。否则,表达式(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。

更多信息:Java Basic Data Types

答案 2 :(得分:0)

如果您的要求不适合任何原始数据类型,您可以使用 BigInteger BigDecimal