Letztes Komma in der while-Schleife wegbekommen?
Kurz gesagt: das ist eine Primfaktorzerlegung. Die while-Schleife gibt solange i+"," aus bis die Zahl eben nicht mehr ohne Rest durch 2 teilbar ist.
Bei 343 gibt das Programm also "7,7,7," aus, statt "7,7,7", so muss Ich es aber vom Programm zurückbekommen. Hab schon viel probiert, mir fällt aber nichts simples ein. Kann ja nicht so schwer sein?
4 Antworten
Ein typisches Problem ja.
In deinem aktuellen Code gehst du halt davon aus, dass immer etwas folgt. Du setzt das Komma obwohl du das ja nicht weißt. Damit hast du immer ein Komma zuviel.
Entweder du bastelt den Code so um, dass das Komma immer vor der ausgegebenen Zahl platziert wird (und dann musst du ne Ausnahme einprogrammieren für die allererste Ausgabe, da darf dann kein Komma ausgegeben werden), oder du sammelst die Ausgabe in einen String, und schneidest dann vor der Ausgabe das letzte Zeichen weg (was dann das Komma wäre).
Beide Varianten sind probate Wege das Ziel zu ereichen.
Nutze einen "Marker". Eine Variable, die dir sagt, ob du im Programm ganz am Anfang bist oder mittendrin. Das macht es leichter. Idealerweise ein Boolean Wert.
bool first = true;
Und dann ersetzt du deine Ausgabe durch diese IF-Anweisung. Das sollte reitheoretisch klappen, wenn ich jetzt keine Tippfehler drin hab :)
if (first == true) { system.out.print(i); first = false; } else { system.out.print(","+i); }
In ungefähr dieser Art implementiere auch ich so etwas.
Wobei
booleanVariable == true
für mich ein Aua-Aua ist.
Ja, nicht unbedingt die eleganteste Lösung, aber sie sollte ihren Zweck erfüllen. Und sizenelan müsste seinen derzeitigen Code kaum verändern.
Hab schon eine Lösung gefunden. Habe einen int x mit 0 initalisiert, eine if-Abfrage mit if x==1 eingebaut und erst unten in der while-schleife int x mit 1 initalisiert. Beim ersten Durchlauf ist also x noch nicht 1, daher kein Komma vor der Zahl :)
Ich würde entweder einen String bauen in dem immer Komma und die Zahl steht und den einfach ab dem zweiten Buchstaben ausgeben:
public class Primfaktorzerlegung {
public static void main(String[] args) {
int zahl = Integer.parseInt(args[0]);
String ergebnis = "";
for (int i = 2; i < zahl; i++) {
while(zahl%i == 0) {
ergebnis += "," + i;
zahl /= i;
}
}
if (zahl>2) {
ergebnis += "," + zahl;
}
System.out.println(ergebnis.substring(1));
}
}
oder - vielleicht etwas eleganter - alle Zahlen in eine Liste (oder Queue) packen und dann mit String.join jeweils ein Komma dazwischen machen:
public class Primfaktorzerlegung {
public static void main(String[] args) {
int zahl = Integer.parseInt(args[0]);
List<Integer> liste = new LinkedList<>();
for (int i = 2; i < zahl; i++) {
while(zahl%i == 0) {
liste.add(i);
zahl /= i;
}
}
if (zahl>2) {
liste.add(zahl);
}
System.out.println(liste);
// oder
System.out.println(String.join(",", liste.stream().map(i->i.toString()).toList()));
// oder
System.out.println(liste.stream().map(i->i.toString()).collect(Collectors.joining(",")));
}
}
(Ich habe keine Java-Erfahrung, deshalb kann es sein, dass ich mich etwas blöd ausdrücke.)
So etwas wie:
String Komma = "";
(also erstmal eine leere Zeichenkette)
und dann die Sequenz
print(Komma + i);
Komma = ",";
Hey,
im Zweifel kannst du einfach substring nutzen, um das letzte Zeichen abzuschneiden.
Mfg Jannick (L1nd)
Daran hab ich auch gedacht, nur fällt mir keine sinnvolle if-Abfrage vor der Schleife ein. Denn i in der Schleife ist maßgebend für die richtige Ausgabe. Könntest du mir vielleicht einen Tipp in die richtige Richtung geben?