2012-03-26 2 views
2
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class InversionCounter { 
    public static void main(String[] args) { 
     Scanner scanner = null; 
     try { 
      scanner = new Scanner(new File("src/IntegerArray.txt")); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int [] nums = new int [100000]; 
     int i = 0; 
     while(scanner.hasNextInt()){ 
      nums[i++] = scanner.nextInt(); 
     } 
     System.out.println(countInversions(nums)); 

    } 

public static int countInversions(int[] nums) { 
    int count = 0; 
    for (int i=0;i<nums.length-1;i++) { 
     for (int j=i+1;j<nums.length;j++) { 
      if (nums[i]>nums[j]) { 
       count++; 
      } 
      else {continue;} 
     } 
    } 
    return count; 
} 

} 

上記のコードは、ファイルから100,000の整数を読み込み、この整数の配列の反転を数えます。出力はおそらく1198233847のような非常に大きな数であり、間違いなく正でなければなりません。しかし、-1887062008のように負の値を出力します。私は同じ目的のために他のアルゴリズムを試して、出力と同じ負の数を持っているので、プログラムロジックは正しいと思われます。私は、結果が大きすぎる正の数であると考えています。その結果、Javaはそれを負の数に変換します。100,000の整数の配列の反転をカウントすると、なぜ負の出力が得られますか?

+3

"結果が大きすぎる正の数であると思われ、その結果、Javaは負の値に変換します。"私はあなたが 'int'ではなく' long'を使うべきだと思っています。繰り返しカウントを増やして8バイトのオーバーフローを起こすことはほとんど不可能です。 –

+1

あなたが疑うように、オーバーフローがあります。 bigintegerを試してください – Jayan

+0

おそらく値には何の影響もありませんが、continueのelseブロックは不要です。 –

答えて

2

ここで、最悪の場合には、int型の最大値(2,147,483,647)よりも大きい4999950000の反転、です。あなたはおそらく長い番号を格納するために使用する必要があります。

関連する問題