Int而不是Long,bug?

时间:2015-10-02 16:15:16

标签: c# algorithm int long-integer

我正在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中检查过它。这是一个错误,还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

T[].LengthintT[].LongLengthlong

尝试此代码,其中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.Lengthint,乘法可能会溢出。因此,在结果已经溢出之后,将结果存储到long