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中检查了它。这是一个错误,还是我遗漏了什么?
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.Length
是int
,并且乘法可能溢出。因此,在long
可能溢出之后,将结果存储到CCD_14中。