2 Stimmen

Zählen von Umkehrungen für ein Array mit 100.000 ganzen Zahlen, warum ein negatives Ergebnis?

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 Ganzzahlen aus einer Datei und zählt die Invertierungen für diese Reihe von Ganzzahlen. Die Ausgabe ist wahrscheinlich eine sehr große Zahl wie 1198233847 und sollte definitiv positiv sein. Es wird jedoch eine negative Zahl wie -1887062008 ausgegeben. Die Programmlogik ist wahrscheinlich korrekt, da ich andere Algorithmen für denselben Zweck ausprobiert habe und die gleiche negative Zahl als Ausgabe erhielt. Ich vermute, dass das Ergebnis eine zu große positive Zahl ist und Java sie deshalb in eine negative Zahl umwandelt.

3voto

Paul Bellora Punkte 52854

Der maximale Wert einer int ist 2.147.483.647 - was Sie sehen, ist ein Überlauf. Sie sollten count a long wenn Sie erwarten, dass sie so groß ist.

Quelle: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

2voto

porges Punkte 29409

Der ungünstigste Fall ist hier 4.999.950.000 Invertierungen, was größer ist als der Maximalwert von int (2.147.483.647). Sie sollten wahrscheinlich eine long verwenden, um die Zahl zu speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X