如何在java中动态存储长值?
我在一个有竞争力的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
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));
// ^^^^^^