2012-03-26 4 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; 
} 

} 

Der obige Code liest 100.000 ganze Zahlen aus einer Datei und zählt die Inversionen für dieses Array von ganzen Zahlen. Die Ausgabe ist wahrscheinlich eine sehr große Zahl wie 1198233847 und sollte definitiv positiv sein. Es gibt jedoch eine negative wie -1887062008 aus. Die Programmlogik ist wahrscheinlich korrekt, da ich andere Algorithmen für den gleichen Zweck ausprobiert habe und die gleiche negative Zahl wie die Ausgabe erhalten habe. Ich vermute, dass das Ergebnis eine zu große positive Zahl ist und Java konvertiert sie in eine negative Zahl.Zählen von Inversionen für ein Array von 100.000 ganzen Zahlen, warum eine negative Ausgabe erhalten?

+3

"Ich vermute, dass das Ergebnis zu groß ist, eine positive Zahl und als Ergebnis konvertiert Java es in eine negative." Ich vermute, dass Sie ein 'long' anstatt ein' int' verwenden sollten. Es ist fast unmöglich, eine 8-Byte-Länge zu überfließen, indem eine Zählung wiederholt inkrementiert wird. –

+1

Wie Sie vermuten, gibt es einen Überlauf. Versuchen Sie Biginteger – Jayan

+0

Wahrscheinlich keinen Einfluss auf den Wert überhaupt, aber der Else-Block mit Fortfahren scheint unnötig. –

Antwort

2

Der schlimmste Fall ist hier 4999950000 Inversionen, die als Maximalwert int ist größer ist (2147483647). Sie sollten wahrscheinlich eine lange verwenden, um die Nummer zu speichern.

Verwandte Themen