Int instead of Long, bug?

本文关键字:bug Long instead of Int | 更新日期: 2023-09-27 18:15:38

我在Codibility上执行taks(其内容在下面的链接中(。我不明白为什么它会给出不同的结果:

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

Int instead of Long, bug?

T[].Length是一个int。3是CCD_ 4。

试试这个代码,其中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;

在这里:

long total = ((2+A.Length)*(A.Length+1)/2);

A.Lengthint,并且乘法可能溢出。因此,在long可能溢出之后,将结果存储到CCD_14中。