我正在Codility上表演(它的内容在下面的链接中)。 我无法理解为什么它会产生不同的结果:
1)80%
public int solution(int[] A)
{
long total = ((2+A.Length)*(A.Length+1)/2);
long sum=0L;
for(int i=0;i<A.Length;i++)
{
sum+=A[i];
}
return (int)(total-sum);
}
2)100%
public int solution(int[] A)
{
long N=A.Length+1;
long total = N*(N+1)/2;
long sum=0L;
for(int i=0;i<A.Length;i++)
{
sum+=A[i];
}
return (int)(total-sum);
}
似乎它将结果视为System.Int32并且它是System.Int64,我已在VS中检查过它。这是一个错误,还是我错过了什么?
答案 0 :(得分:4)
T[].Length
是int
。 T[].LongLength
是long
。
尝试此代码,其中checked
表示算术溢出应导致异常:
long total = checked((A.Length + 2) * (A.Length + 1) / 2);
您应该获得OverflowException
,因为即使A.Length
的大小不超过int
,产品也会如此。当您将代码更改为:
long N = A.Length + 1;
long total = N * (N + 1) / 2;
您现在使用long
而不是int
进行乘法运算,因此没有溢出。
此代码也可正常工作,即使我更喜欢单独定义N
的版本:
long total = (A.LongLength + 2) * (A.LongLength + 1) / 2;
答案 1 :(得分:3)
在这里:
long total = ((2+A.Length)*(A.Length+1)/2);
A.Length
是int
,乘法可能会溢出。因此,在结果已经溢出之后,将结果存储到long
。