如何动态地在java中存储long值?

时间:2015-04-03 08:01:22

标签: java

我在java中竞争性编码网站上解决了一个问题。我的问题代码是:

long arr[]=new long[1000001];
for(int i=2;i<=1000000;i++)
{
    arr[i]=arr[i-1]+(i*(i-1));
}
int Test = Integer.parseInt(br.readLine());
for (int i = 0; i < Test; i++) {
    int num=Integer.parseInt(br.readLine());
    System.out.println(arr[num]);
}

输入

3

1

2

3

4

它显示正确的输出:

0

2

8

20

但输入如下:

3

10000

100000

百万

显示为:

333333330000

18108503577376

16881588911936

但输出应为:

333333330000

333333333300000

333333333333000000

最后两个是错误的。我尝试使用BigInteger,但时间已经超过了。 但是我在python 2.7中解决了它:

a=[]
a.append(0)
a.append(0)
for i in range(2,1000001):
    a.append(a[i-1]+(i*(i-1)));
t=input()
while t:
    t-=1
    print a[input()]

输入:

输入

3

10000

100000

百万

输出

333333330000

333333333300000

333333333333000000

有人请教我如何用Java解决这个问题。 即使答案适合长期,为什么它没有显示正确的输出?

1 个答案:

答案 0 :(得分:1)

您使用 int s 进行大部分计算,而不是long s:

arr[i]=arr[i-1]+(i*(i-1));
//              ^^^^^^^^^------ All of this is with `int`s

当您将int添加到long时转换为arr[i-1],它会溢出long范围。

为了避免溢出,你需要投射,这样你就可以使用arr[i]=arr[i-1]+((long)i*(i-1)); // ^^^^^^ s:

{{1}}

Live example