2013-06-29 42 views
2

在我的Java代碼中,對於一個排序程序(它使用我的insertionsort算法對100000個整數進行排序),我試圖找出多少次數組交換。因爲sort()方法是靜態的,所以我將它設置爲靜態變量。如何在超出限制時打印Java int值

但是,在程序運行期間的某個時候,我認爲整數限制被超過,最終計數顯示爲負數。必須有一種方法來糾正這種情況,並獲得數字上正確的計數,但我無法弄清楚這一點......你能幫忙嗎?

public class InsertionSort { 
    private static int exchcount=0; 

    public static void exch(Comparable[] a, int i,int j){ 
     Comparable temp = a[i]; 
     a[i] = a[j]; 
     a[j] = temp; 
    } 
    public static int exchangeCount(){ 
     return exchcount; 
    } 

    public static void sort(Comparable[] a){ 
    int N = a.length;  

    for(int i=0; i< N;i++){ 
     for(int j=i; j>0 && less(a[j],a[j-1]); j--){ 
     exch(a,j,j-1); 
     exchcount++; 

     } 
     } 
    } 
... 

    public static void main(String[] args) { 
     Integer[] a = RandomNumberArrayGenerator.generate(100000); 
     sort(a); 
     System.out.println("number of exchanges="+ exchangeCount()); 
    } 

這給

number of exchanges= -1799089211 
+4

改爲使用長類型? –

+0

使用BitInteger .. – Maroun

+2

這個詞是「溢出」 – leonbloy

回答

4

原始類型int被簽名,32位值從-2,147,483,648到2,147,483,647(含)。請參閱java tutorial

如果結束後你的價值是-1799089211比它意味着當你exchanges達到2,147,483,647它去2,147,483,648,比-2,147,483,647等等......那麼,你是(-2,147,483,648 + 1799089211 - 1)超過限額基本類型int。當然,這種情況假設你的計數器只溢出了一次,但它應該溢出一次以上。

使用long數據類型和(只是肯定)計數器的溢出測試。

1

每次增加它,你可以檢查它是否是負的,如果是則設置溢出一次。您也可以使用另一個整數來跟蹤這一點。之後也許將其設置爲0。你會冒險

exchcount++; 

exchcount++; 
    if (exchcount<0) { 
     overflowcount++; 
     exchcount=0; 
    } 

您也可以使用長代替,這將讓你的程序使用64而不是32位。

這就需要你有機會

private static int exchcount=0; 

private static long exchcount=0; 

這將允許您計入2^63,而不是2^31

5

最簡單的是把反擊成long而不是int。這將使您能夠計算多達9,223,372,036,854,775,807。

如果每個exch()需要一個CPU週期,則在3GHz計算機上long計數器溢出需要大約100年時間。

0

使用long而不是int。這是簡單的答案。