Primfaktorenzerlegung

fleckdalm

Bekanntes Mitglied
wir haben als aufgabe folgende aufagbenstellung bekommen:

Erstelle ein Programm, das die Primfaktorenzerlegung einer Zahl (d.h. die Darstellung der Zahl als Produkt von Primzahlen) berechnet.
Beispiel: 36=2*2*3*3
Die Primfaktorenzerlegung wird als String gespeichert. Verwende für die Zerlegung zwei ineinander geschachtelte Schleifen, und wähle jeweils geeignete Schleifen. Achte darauf, dass die Ausgabe der Primfaktoren genau der Abbildung entspricht.

und ich habe folgendes geschrieben:
Java:
    public void berechne(){
        boolean prim;
int zahl;
         zahl=Integer.parseInt(JOptionPane.showInputDialog("Gib die zahl ein"));
        String ausgabe=zahl+" =";
        
        while(zahl>0){
          
          for(int i=3;i<zahl;i++){
              prim=true;
              
              for (int x=2;x<i;x++){
                
                  if(i%x==0){
                      
                      prim=false;
                      break;
                  }
                 
              }
              if(prim==true){
                  
             while (zahl%i==0){
                 zahl/=i;
                 ausgabe+=i+"*";
              
             }
             }
          }

        }
        JOptionPane.showMessageDialog(null, ausgabe);


    }

  
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().berechne();
        // TODO code application logic here
    }
aus irgendeinem grund lande ich immer in einer endlosschleife ich weiß nur nicht wieso. Was habe ich falsch gemacht? Gibt es vielleicht einen besseren lösungsansatz? Ich suche zuerst ob die eine Primzahl, und dann schaue ich ob man die zahl restlos durch die Primzahl tielen kann, ist das möglich wird getielt sonst kommt die nächste Primzahl. Ich weiß echt nicht wieso das nicht geht.

Danke, mfg Fleckdalm
 

diggaa1984

Top Contributor
wenn du dein code mal mit der zahl 4 durchspielst kommst du an der folgenden stelle nicht in die schleife, und deine zahl wird nie verringert, folglich läuft die äußere whileschleife unendlich oft!

Java:
while (zahl%i==0){
    zahl/=i;
    ausgabe+=i+"*";
}
 

WIaimy

Mitglied
Falls es dir weiterhilft, ich habe vor ein paar Tagen das Ganze rekursiv gemacht, kannst ja mal einen Blick drauf werfen:
Java:
	static String primfaktor(int x, int zwei){
		if(zwei < x && x % zwei == 0)
			return zwei + " * " + primfaktor((x / zwei) , 2);
		else if(zwei < x && zwei == 2)
			return primfaktor(x , (zwei + 1));
		else if(zwei < x && zwei != 2)
			return primfaktor(x , (zwei + 2));
		return "" + zwei;
	}
 

fleckdalm

Bekanntes Mitglied
Ich verstehe deine Methode leider nicht so ganz. Was werden denn da für 2 zahlen übergebn? Außerdem würde ich gern wissen wie ich meine Methode zum funktkionieren bringe.
Danke, mfg Fleckdalm
 

diggaa1984

Top Contributor
hab das nun mal funktional gemacht:

Java:
public class Test { 
 
public static void berechne(int number){
        boolean prim;
        
	if (number == 1) {
		System.out.println(1);
	} else {
		while(number>1) {
          
			for(int i=2;i<=number;i++) {
				prim=true;
              
				if (i != 2) {
					for (int x=2;x<i;x++) {
						if(i%x==0){
							prim=false;
							break;
						}
					}
				}
		
				if(prim) {
					while (number%i==0) {
						number/=i;
						System.out.println(i);
					}
				}
			}
 
		}
	}
}
 
  
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        berechne(21);
    }
}

du musst nun nur nochmal das mit der korrekten Ausgabe anpassen

liefert:
1 = 1
4 = 2 2
321 = 3 107
4375 = 5 5 5 5 7
 
Zuletzt bearbeitet:

fleckdalm

Bekanntes Mitglied
Ich habe es selbst hingekriegt, einfach von vorne begonnen;-)
Für alle die es interessiert, hier der funktionierende Code:
Java:
 public void berechne(){
        int z=Integer.parseInt(JOptionPane.showInputDialog("Gib die zahl ein"));
        String ausgabe=z+" =";
        for(int x=2;x<z;x++){

        boolean prim=true;

      for(int y=2;y<x;y++){
      if(x%y==0){
        prim=false;break;

      }

      }
        if (prim==true){
         while (z%x==0){
                 z/=x;
                 ausgabe+=x+"*";

             }

          System.out.println(""+x);
        }
      }


    JOptionPane.showMessageDialog(null, ausgabe);
    }
 

fleckdalm

Bekanntes Mitglied
Ja, aber das ist nur ein kleiner fehler der von einer fehlerhaften benutzereingabe stammt und deshalbt von der aufgabenstellung her unwichtig ist.
Mich würde übrigens immer noch interessieren wie die rekursive mthode funktioniert.
mfg Fleckdalm
 

fleckdalm

Bekanntes Mitglied
Mein problem ist das ich nicht weiß was für variablen da übergeben werden bei mir gibt der benutzer nur eine zahl ein hier werden aber 2 variablen übergeben.
mfg Fleckdalm
 

diggaa1984

Top Contributor
die zweite zahl soll deine grad aktuelle primzahl darstellen, welche genutz wird um den verbleibenden rest zu teilen .. ich hab das nicht ausprobiert aber das stumpfe +2 scheint mir ein wenig zu allgemein, eventuell ist es aber ausreichend, habe mich nicht näher mit den mathematischen gegebenheiten beschäftigt.

sicherlich kann nur eine ungerade zahl ne primzahl sein, aber 15 ist ja zb keine .. die würde aber wohl gar net erst greifen, da man die ja wieder aus 3 und 5 zusammensetzen kann .. aber wie gesagt, da gibts entweder nen griffigen theoretischen hintergrund oder man muss versuchen ob da eventuell irgendwann n fehler auftritt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Primfaktorenzerlegung Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben