Primfaktorenzerlegung

da_Gaber

Mitglied
Liebe Java Community,
ich programmiere seit einem Monat in Java und komme bei folgender HÜ nicht auf die richtige Lösung. Ich verstehe nicht wie ich den String korrekt in der main Methode ausgeben kann.

Aufgabe:
Schreiben sie ein Java-Programm, das alle Primfaktoren einer positiven ganzen Zahl (größer 1) berechnet und ausgibt. Wird keine gültige Zahl eingegeben, soll das Programm den Benutzer erneut zur Eingabe einer Zahl auffordern, solange bis die Eingabe gültig ist.

Zur Bestimmung der Primfaktoren soll die Methode public static String primeFactors(int number) implementiert werden, die beispielsweise bei der Primfaktorenzerlegung 48 den String 2*2*2*2*3 zurückliefert.
 

LimDul

Top Contributor
Die Frage dem Wortlaut beantwortet, so:
Java:
System.out.println(primeFactors(gueltigeEingabe));

Deine Problem dürfte aber eher die gesamte Implementierung sein.
Da ich nicht weiß, was ihr genau nützen dürft, hier mal eine generelle Taktik für solche Probleme: Zerteile sie in kleinere Probleme.

Du hast im Prinzip drei Teilaufgaben:

Eingabe einer gültigen Zahl
Eingabe auslesen und prüfen, wiederholen bis gültige Eingabe vorliegt.
Das heißt, nach dieser Teilaufgabe hast du eine gültige Zahl (größer 1) irgendwo (sinnvollerweise in einer Variablen) vorliegen

Ermitteln der Primfaktoren
Nun musst du die Primfaktoren ermitteln. Hier interessiert dich erst mal die korrekte Ausgabe nicht. Erstmal das Problem lösen, die zu ermitteln und entweder in einer geeigneten Datenstruktur speichern oder einfach stumpf ausgeben mit System.out.println.


Zusammenbauen des Strings
Die Methode soll einen String zurückgeben. Du hast bereits gelöst, dass du alle Primfaktoren ermitteln kannst - jetzt musst du dir überlegen, wie du den String zusammenbaust, dass jeweils zwischen 2 Primfaktoren ein Sternchen steht.

Wie weit bist du mit den Teilen den bereits gekommen und woran hapert es konkret?
 

da_Gaber

Mitglied
Bei mir scheitert es am String, weil momentan nur die jeweils letzte Zahl i (int i für die Primfaktorenzerlegung) ausgegeben wird.

Java:
public class Primfaktorenzerlegung {
    public static void main(String [] args) {
        System.out.println("Primfaktoren");
        System.out.println();
        System.out.print("Geben Sie eine Zahl ein: ");
        int number = In.readInt();
        while (number < 1) {
            System.out.print("Geben Sie eine positive Zahl ein: ");
            number = In.readInt();
        }
        System.out.print("Primfaktorenzerlegung der Zahl " +number + ": ");
        String primeFactors = primeFactors(number);
        System.out.print(primeFactors);
        
    }
    public static String primeFactors(int number) {
        int i = 2;
        String primeFactors ="A";
        while (number > 1) {
            while (number % i == 0) {
                number = number/i;
                primeFactors = (i + "*");
            }
            if (i==2) {
                i++;
             }
             else {
                 i = i+2;
             }
         }
         return primeFactors;
    }
}
 

LimDul

Top Contributor
Also ein paar Anmerkungen
Java:
        String primeFactors ="A";
Warum wird da ein "A" zugewiesen?

Java:
                primeFactors = (i + "*");
Hier weißt du dem String einen komplett neuen Wert zu. Wenn du etwas anhängen willst, musst du eine der folgenden Varianten verwenden:
Java:
primeFactors = primeFactors+ i + "*";
primeFactors += i + "*";

Du hängst aktuell immer ein Sternchen an den String dran. Das ist nicht richtig, überleg dir mal, wann du ein Sternchen dran hängen musst und wann nicht.
 

da_Gaber

Mitglied
"A" weise ich deswegen zu, weil ich sonst die Fehlermeldung bekomme, dass der String nicht gefunden werden kann, ich weiß momentan noch nicht ob es da eine saubere Lösung gibt.
wenn ich primeFactors = primeFactors + i + "*"; schreibe, dann bekomme ich bei der Zahl 80 zweimal die 5* als Ausgabe :(
 

da_Gaber

Mitglied
okay ich habs!!!

Java:
public static String primeFactors(int number) {
        int i = 2;
        String primeFactors = i + "*";
        while (number > 1) {
            while (number % i == 0) {
                number = number/i;
                primeFactors = primeFactors + i + "*";
            }
            if (i==2) {
                i++;
             }
             else {
                 i = i+2;
             }
         }
         return primeFactors;
    }

Jetzt hab ich nurnoch das Problem, dass am Schluss auch "*" in der Konsole ausgegeben wird
 
K

kneitzel

Gast
Dann teste Deinen Code noch einmal im Detail - ich bezweifle, dass der Code richtig ist.

Prüfe es mal mit der Zahl 3.

Und schau Dir einmal an, was denn number und i für einen Wert haben, wenn es der letzte Teiler ist. Vielleicht kannst Du das ja dann prüfen und das "*" in dem Fall nicht hinzu fügen?
 

da_Gaber

Mitglied
Hab den Fehler bereinigt (auch wenn ich es vermutlich ziemlich unschön gemacht habe)
Mein einziges Problem ist der Stern, welcher beim letzten i noch drangefügt wird. Da komm ich leider nicht auf die Lösung.
Gibt es vielleicht einen String.format() Befehl, welcher einen Stern zwischen jeden Eintrag dranhängt?

Java:
public class Primfaktorenzerlegung {
    public static void main(String [] args) {
        System.out.println("Primfaktoren");
        System.out.println();
        System.out.print("Geben Sie eine Zahl ein: ");
        int number = In.readInt();
        while (number < 1) {
            System.out.print("Geben Sie eine positive Zahl ein: ");
            number = In.readInt();
        }
        System.out.print("Primfaktorenzerlegung der Zahl ");
        String primeFactors = primeFactors(number);
        System.out.print(primeFactors);
        
    }
    public static String primeFactors(int number) {
        int i = 2;
        String primeFactors = number + " : ";
        while (number > 1) {
            while (number % i == 0) {
                number = number/i;
                primeFactors = primeFactors + i + "*";
            }
            if (i==2) {
                i++;
             }
             else {
                 i = i+2;
             }
         }
         return primeFactors;
    }
}
 
K

kneitzel

Gast
Gib doch einfach einmal vor der Zeile primeFactors = primeFactors + i + "*"; den Wert von number aus.

Und die eine Zeile kann man ja in zwei Befehle aufteilen:
Java:
primeFactors = primeFactors + i;
primeFactors = primeFactors + "*";

Nun ist die Frage: Kannst Du eine Bedingung definieren, wann der * hinzugefügt werden muss und wann nicht?
 

da_Gaber

Mitglied
okay es war doch das > Zeichen ;)
Code müsste jetzt syntaktisch korrekt sein, obwohl ich es zugegebener Maßen ohne String und einfach mit System.out.print(); lieber progammiert hätte.
Java:
public class Primfaktorenzerlegung {
    public static void main(String [] args) {
        System.out.println("Primfaktoren");
        System.out.println();
        System.out.print("Geben Sie eine Zahl ein: ");
        int number = In.readInt();
        while (number < 1) {
            System.out.print("Geben Sie eine positive Zahl ein: ");
            number = In.readInt();
        }
        System.out.print("Primfaktorenzerlegung der Zahl " + number + " : ");
        String primeFactors = primeFactors(number);
        System.out.print(primeFactors);
        
    }
    public static String primeFactors(int number) {
        int i = 2;
        String primeFactors = "";
        while (number > 1) {
            while (number % i == 0) {
                number = number/i;
                primeFactors = primeFactors + i;
                if (number > i ) {
                    primeFactors = primeFactors + "*";
                }
            }
            if (i==2) {
                i++;
             }
             else {
                 i = i+2;
             }
         }
         return primeFactors;
    }
}

Danke vielmals für die schnellen und hilfreichen Antworten!
 
K

kneitzel

Gast
Weil da am Ende zwei Mal der letzte Teiler kommt.

Du teilst number am Anfang direkt durch I, dadurch ist deine Abfrage falsch. Bau doch direkt vor dem if eine Ausgabe von number ein. Dann siehst du direkt, was ich meine.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Primfaktorenzerlegung Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben