Int 而不是 Long,错误?
Int instead of Long, bug?
我在 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里查过了。这是一个错误,还是我遗漏了什么?
在这里:
long total = ((2+A.Length)*(A.Length+1)/2);
A.Length
是一个int
,乘法可以溢出。因此,在结果可能溢出后,您将结果存储到 long
。
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;
我在 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里查过了。这是一个错误,还是我遗漏了什么?
在这里:
long total = ((2+A.Length)*(A.Length+1)/2);
A.Length
是一个int
,乘法可以溢出。因此,在结果可能溢出后,您将结果存储到 long
。
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;