Hi,
ich wollte ein Programm erstellen, das mir ausgibt durch welche Zahlen eine Zahl teilbar ist und das ausgibt, wenn es sich um eine Primzahl handelt. Aber leider funktioniert das nicht so wie ich es mir gedacht habe. Ich bekomme zwar die richtigen Teiler raus aber der Rest klappt nicht. Hat jemand eine Lösung für mich?
Vielen Dank für Eure Hilfe
P.S: Hier ist mein Java-Code
Java:
importjava.util.Scanner;publicclassTeiler{publicstaticvoidmain(String[] args){int zahl;int teiler;
teiler =1;System.out.println("Geben Sie eine Zahl ein:");Scanner input =newScanner(System.in);
zahl = input.nextInt();System.out.println();System.out.println("Die Zahl "+ zahl +" ist teilbar durch die Zahlen:");do{if(zahl%teiler==0)System.out.println(teiler);
teiler++;while(((teiler*teiler)<=zahl)&&(zahl>1)){
teiler++;if(zahl%teiler!=0)System.out.println(zahl +" ist eine Primzahl.");}}while(teiler<=zahl);}}
Er benutzt die do-Schleife ja .. irgendwie, die allein würde ja alle Teile ausgeben.
Wenn du jetzt eine boolsche Variable istPrim hättest, und diese nur false setzen würdest, wenn ein Teiler gefunden wurde, sollte das ganze viel einfacher funktionieren. Deine innere Schleife ist irgendwie fehl am Platz und sorgt dafür, dass u.U. nicht alle Teiler gefunden werden. Was wolltest du denn damit bewirken?
Eigentlich will ich keine "kompletten" Programme posten, aber falls du nicht weiter kommst, schau dir das hier mal an:
Java:
importjava.util.Scanner;publicclassTeiler{publicstaticvoidmain(String[] args){// Zahl initialisierenSystem.out.print("Geben Sie eine Zahl ein: ");Scanner input =newScanner(System.in);int zahl = input.nextInt();// Bei drei anfangen, weil eins immer Teiler istint teiler =2;// Anfangs davon ausgehen, dass Zahl prim istboolean istPrim =true;System.out.println();System.out.println("Die Zahl "+ zahl +" ist teilbar durch die Zahlen:");// Immer durch eins teilbarSystem.out.println("1");// Wieso willst du eine do-Schleife benutzen?do{// Wenn teiler teilt, ausgeben und ist nicht primif(zahl % teiler ==0){System.out.println(teiler);
istPrim =false;}
teiler++;}while(teiler < zahl);// Immer durch sich selbst teilbar, keine doppelte Ausgabe bei eins und zweiif(zahl >2){System.out.println(zahl);}// Wenn Zahl prim istif((istPrim || zahl ==2)&& zahl !=1){System.out.println(zahl +" ist prim.");}}}
Das habe ich gerade geschrieben und noch nicht wirklich getestet, sollte aber grob funktionieren. Ich habe größtenteils deinen Code benutzt und nur leicht abgewandelt. Mein Beispiel ist jetzt genau wie deins alles andere als effizient, daran musst du dich dann selbst mal versuchen.
Das habe ich gerade geschrieben und noch nicht wirklich getestet, sollte aber grob funktionieren. Ich habe größtenteils deinen Code benutzt und nur leicht abgewandelt. Mein Beispiel ist jetzt genau wie deins alles andere als effizient, daran musst du dich dann selbst mal versuchen.
Nur Anmerkung:
Kleiner Tipp, baue die Variable "istPrim" noch in der Bedingung der Schleife ein.
Wenn du den 1.Teiler hast der ungleich 1 und ungleich ZAHL ist, ist es keine Primzahl mehr und du brauchst die Schleife nicht weiterlaufen lassen.
Außerdem reicht es "teiler" bis maximal "zahl/2" zu erhöhen.
Ich habe den TE so verstanden, dass er alle Teiler ausgeben möchte und optional, sofern es sich um eine Primzahl handelt, dass es eine Primzahl ist. Deshalb dieser Vorschlag
Nach der do-Schleife hab ich gefragt, weil sie halt erstmal fehleranfälliger dadurch ist, dass keine Überprüfung am Anfang steht.
Dass das ganze nicht effizient ist, ist mir wie gesagt bewusst, ich wollte auch nicht allzu viel an seinem Code ändern, damit er noch was zu tun hat und gucken kann, wo er sich bei großen Zahlen die ein oder andere Sekunde sparen kann.. Wenn er nur die Primeigenschaft finden will, kann er auch die Teilbarkeit von 2 prüfen, bei 3 starten und nur bis zur Wurzel der Zahl laufen, soweit ich weiß. Müsste nochmal etwas performanter sein