Größtes Produkt in einem String

firehit

Mitglied
Hallo Leute...
Ich bin noch relativ unerfahren was Programmieren angeht und habe folgendes Problem:
Ich möchte einen String nach dem größtmöglichen Produkt aus 13 aufeinanderfolgenden Zahlen durchsuchen. Dazu habe ich folgendes Programm geschrieben:

Java:
public class LargestProductInASeries {

    public static void main(String[] args) {
	String string = "73167176531330624919225119674426574742355349194934"+
			"96983520312774506326239578318016984801869478851843"+
			"85861560789112949495459501737958331952853208805511"+
			"12540698747158523863050715693290963295227443043557"+
			"66896648950445244523161731856403098711121722383113"+
			"62229893423380308135336276614282806444486645238749"+
			"30358907296290491560440772390713810515859307960866"+
			"70172427121883998797908792274921901699720888093776"+
			"65727333001053367881220235421809751254540594752243"+
			"52584907711670556013604839586446706324415722155397"+
			"53697817977846174064955149290862569321978468622482"+
			"83972241375657056057490261407972968652414535100474"+
			"82166370484403199890008895243450658541227588666881"+
			"16427171479924442928230863465674813919123162824586"+
			"17866458359124566529476545682848912883142607690042"+
			"24219022671055626321111109370544217506941658960408"+
			"07198403850962455444362981230987879927244284909188"+
			"84580156166097919133875499200524063689912560717606"+
			"05886116467109405077541002256983155200055935729725"+
			"71636269561882670428252483600823257530420752963450";
	long max =0;
	int numbarray[]= new int [13];
	for (int i=0;i<=string.length()-13;i++){
	    String sub = string.substring(i, i+13);
	    for(int j=0;j<sub.length();j++){
		numbarray[j]=(int)sub.charAt(j)-48;
		long product = 1;
		for (int x:numbarray){
		    product*=x;
		    if(product>max){
			max=product;
		    }
		}
	    }
	}
	System.out.print(max);
    }

}

Das ausgegebene Endergebnis ist jedoch falsch. Wenn ich mir allerdings jedes zwischenzeitliche Maximum ausgeben lasse ist das richtige Ergebis dabei. Das Programm findet aber anschließend weiter Maxima die es aber nicht geben dürfte. Leider finde ich den Fehler nicht und hoffe ihr könnt mir dabei helfen.
 
du solltest das maximum erst nach der inneren schleife machen, also:
Java:
long product = 1;
for (int x : numbarray) {
	product *= x;
}
if (product > max) {
	max = product;
	System.out.println(max);
}
denn ansonsten würden folgende zahlen sofort als maximum durchgehen, obwohl das produkt 0 ist:
9999999999990
 
Danke für die Antwort. Könntest du mir nich kurz erklären warum 0 in diesem Fall als max gesetzt wird? Ich habe das Programm jetzt so abgeändert wie du es vorgeschlagen hast. Allerdings bekomme ich auch hier nach dem eigentlich richtigen Ergebnis noch weitere ausgegeben. Ich habe mir zusätzlich noch das Array und den Stringabschnitt ausgeben lassen und bekomme folgendes als letzte Ausgaben angezeigt:

23514624000[5, 5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9]5576689664895
32920473600[5, 5, 7, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9]5576689664895
37623398400[5, 5, 7, 6, 6, 8, 8, 9, 6, 6, 4, 8, 9]5576689664895
42326323200[5, 5, 7, 6, 6, 8, 9, 9, 6, 6, 4, 8, 9]5576689664895

Die Lösung der Aufgabe sollte das Ergebnis 23514624000 sein.
Den richtigen Stringabschnitt hat das Programm also gefunden, aber ich verstehe nicht wie die letzten 3 Ausgaben entstehen? Irgendwie werden falsche Zahlen im Array gespeichert.
 
im vorherigen fall war es halt so das dein programm bei jeder zahl das maximum ggf anpasst, obwohl das "lokale" maximum noch gar nicht fertig war und ggf. sogar noch 0 wird.

Aber mir ist gerade ein anderes problem in deinem programm aufgefallen
In deiner äußeren Schleife (Zähler i) gehst den String halt von vorn bis hinten durch (ok).
jedes mal holst du dir einen substring (ineffizient aber ok)
und dann durchläufst du den substring und änderst dabei dein numbarray ab, und dann durchläufst du schon dein numbarray, obwohl dieses noch gar nicht auf dem neusten stand gebracht wurde!
Du darfst dein zahlenarray erst durchlaufen, wenn du es auch komplett angepasst hast!
Java:
for (int i = 0; i <= string.length() - 13; i++) {
	String sub = string.substring(i, i + 13);
	for (int j = 0; j < sub.length(); j++) {
		numbarray[j] = sub.charAt(j) - 48;
	}
	long product = 1;
	for (int x : numbarray) {
		product *= x;
	}
	if (product > max) {
		max = product;
	}
}

Aber ich würde dir empfehlen das allgemein anders zu machen.
Momentan rechnest du jeden Schleifendurchlauf von i, den neuen substring aus und erzeugst ein neues numbarray.
Es wäre viel eleganter und vor allem effizienter, wenn du ganz am anfang, einmal den ganzen String in ein intarray umwandelst und dann einfach dieses durchläufst. Dann brauchst du weder einen substring, noch musst du diesen immer wieder in zahlen umwandeln
 
Zuletzt bearbeitet:
Danke, so funktioniert es wie es sollte. Mit der Effizienz hast du natürlich recht, das werde ich bei Gelegenheit überarbeiten. Ansonsten nochmals vielen Dank für deine Hilfe.
 

Zurück
Oben