如何在java中动态存储长值?

如何在java中动态存储长值?,java,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

我在一个有竞争力的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]);
}
输入:

输入

三,

一万

十万

一百万

输出

333333330000

333300000

333000000

有人请帮助我如何用Java解决这个问题。
为什么即使答案是长的,也显示不出正确的输出?

您大部分的计算都是用
int
s
,而不是
long
s:

arr[i]=arr[i-1]+(i*(i-1));
//              ^^^^^^^^^------ All of this is with `int`s
因此,当您将其添加到
arr[i-1]
时,它会在转换为
long
之前溢出
int
范围

为避免溢出,您需要强制转换,以便使用前面的
long
s:

arr[i]=arr[i-1]+((long)i*(i-1));
//               ^^^^^^

非常感谢,它起了作用。但是为什么arr[i]=arr[i-1]+(long)(i*(i-1));不工作。@处理器:因为
i*(i-1)
是用
int
值处理的,并且溢出。您正在铸造
i*(i-1)
的结果,此时溢出已经发生。现在我明白了。
arr[i]=arr[i-1]+((long)i*(i-1));
//               ^^^^^^