2015-10-02 48 views
0

我在Codility表演了一段時間(它的內容在下面的鏈接中)。 我不明白爲什麼它給了不同的結果:Int而不是Long,bug?

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)

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中檢查過它。這是一個錯誤,還是我錯過了什麼?

+1

代碼示例預計將在問題本身,而不是在外部鏈接。 –

回答

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; 
3

在這裏:

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

A.Lengthint,和乘法可能溢出。因此,在已經可能溢出之後,將結果存儲到long