我在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解决这个问题。 即使答案适合长期,为什么它没有显示正确的输出?
答案 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}}