Perfekte Zahlen < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:22 Do 04.11.2010 | Autor: | Fatih17 |
Hallo,
ich wollte ein Programm schreiben, dass perfekte Zahlen berechnet. Das heißt z.B.: 6=3+2+1 also ist 6 eine perfekte Zahl, da die Summe all ihrer Teiler auch 6 ergibt.
Das Problem:
Ich habe es zwar geschafft, dass er augibt, dass es eine perfekte Zahl gibt, aber ich muss es auch hinkriegen, dass er den Rechenweg ausgibt. Also das "3+2+1".
Meine Idee:
Ich dachte da an Modulo. Er soll alle Teiler ermitteln die keinen Rest haben und diese ausgeben. Ich habe es dann erstmal in einem anderen Code allgemein versucht bekomme es aber nicht hin.
Hier der Code für die Berechnung der vollkommenen Zahlen:
public class test
{
public static void main ( String[] args )
{
int E;
int T = 1;
int R;
int S = 0;
System.out.println("Test auf vollkommene Zahl");
System.out.println("=========================");
System.out.print("Bitte eine Zahl x > 0 eingeben: ");
E = In.readInt();
while ( T < E )
{
R = E;
while ( R > 0 ) { R =R - T; }
if ( R == 0 ) { S =S + T; }
T = T + 1;
}
if ( S == E )
{
System.out.println("Die Zahl " + E + " ist eine vollkommene Zahl.");
}
if ( S!=E)
{
System.out.println("Die Zahl " + E + " ist keine vollkommene Zahl.");
}
}
}
Hier der Code für die Berechnung der Teiler die nicht funktioniert :
public class Perfekt
{
public static void main ( String[] args )
{
int j;
int x;
int y = 1;
int z;
System.out.println("Test auf Teiler");
System.out.println("=========================");
System.out.print("Bitte eine Zahl x > 0 eingeben: ");
x = In.readInt();
while (x>0) {
x=x-y;
z=x;
j=z%y;
if (j==0) {
System.out.println("Teiler sind"+j);
}
}
}
}
Danke schonmal im voraus :)
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:18 Do 04.11.2010 | Autor: | leduart |
Hallo
ich versteh schon nicht dein Vorgehen bei der Teilersuche: du ziehst immer wieder y=1, also 1 von deiner Zahl ab?
ich hab vergessen , oder weiss nicht was z%y, hier also z%1 tut?
eigntlich willst du die Teiler deiner Eingabe, dabei vielleicht wissen, dass wenn 2 kein Teiler ist auch alle restlichen geraden Zahlen keine Teiler sind,
Schon dein erstes Teilprogramm ist ja was schwerfällig.
un etwa rauszukriegen, ob 1234 durch 2 Teilbar ist brauchst du 617 Schritte?
wieviel Schritte braucht dein programm um rauszufinden ob 1 Million eine perfekte Zahl ist?
Aber wenn schon so kompliziert warum Merkt sich in dem Schritt
if ( R == 0 ) { S =S + T; }
das T, z:Bsp mit T=Te(i), i=i+1 wobei du natürlich noch Te initialisieren musst.
Gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:27 Do 04.11.2010 | Autor: | Fatih17 |
Hallo,
das % berechnet ob der Teiler der eingebenen Zahl eine Kommastelle hat oder nicht. Falls nicht also ==0 soll er es ausgeben.
Ich habe mal einen anderen Code geschrieben, vielleicht ist dieser verständlicher:
public class Perfekt {
public static void main(String[] args)
{
int k;
int n;
int summe = 0;
System.out.print("Bitte eine Ganzzahl eingeben: ");
n = In.readInt();
for(int j = n; j > 1; j--)
{
for(int i = 1; i < j; i++)
{
if(j%i == 0)
{
summe = summe + i;
System.out.println("Teiler ist" +i);
}
if(summe > n )
break;
}
if(summe == j)
{
System.out.println("Die Zahl: " +j+ " ist eine perfekte Zahl!");
}
}
}
}
Jetzt schreibt er zwar die Teiler richtig, aber warum folgen daraufhin viele 1en??
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:40 Do 04.11.2010 | Autor: | leduart |
Hallo
für jedes j geht er wieder in die i schleife, die mit 1 anfängt, das ein Teiler von allen j ist, also druckt er jedes mal das i aus.
Durchlauf deine Schleifen immer selbst mindestens 2 mal, befolge selbst (ohne computer) alle deine Anweisungen, dann weisst du was passieren wird.
gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:19 Do 04.11.2010 | Autor: | Fatih17 |
tut mir leid aber ich verstehe nicht was du meinst , der soll ja eigentlich aufhören wenn die summe = n wird. Tut er aber irgendwie nicht, sondern macht weiter, aber warum, weiß ich immernoch nicht!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:29 Do 04.11.2010 | Autor: | leduart |
Hallo
wenn die Summe>n wird, geht er aus der i Schleife raus in die j schleife, da wird er direkt wieder in die i schleife gejagt, i=1, und dann der Befehl print i
Geh doch wirklich mal selbst deine Schleifen durch, nimm dann an s>n was sind dann deine Anweisungen?
Gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:36 Do 04.11.2010 | Autor: | Fatih17 |
Aha, okay ich habe es jetzt kapiert und berichtigt:
Jetzt gibt er tatsächlig die Teiler untereinander aus.
Hier der Code:
public class Perfekt {
public static void main(String[] args)
{
int i;
int k;
int n;
int summe = 0;
System.out.print("Bitte eine Ganzzahl eingeben: ");
n = In.readInt();
for(int j = n; j > 1; j--)
{
for( i = 1; i < j; i++)
{
if(j%i == 0)
{
System.out.println("Teiler ist" +i);
summe = summe + i;
}
if(summe > n )
break;
}
if(summe == n)
{
System.out.println("Die Zahl: " +j+ " ist eine perfekte Zahl!");
}
if ( i==n) { break;}
}
}
}
Jetzt gibt es das nächste Problem:
Wie kriege ich diese hintereinander ausgegeben. Er schreibt die ja immer von oben nach unten nicht von links nach rechts ?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:20 Fr 05.11.2010 | Autor: | leduart |
Hallo
du solltest ne Liste von java Befehlen anlegen und haben, am besten ausdrucken und neben deinen computer legen.
prinln(..) ist der Befehl drucken und in die nexte Zeile springen.
print tut das nicht, aber soll er wirklich vor jede Zahl schreiben Teiler ist?
Gruss leduart
|
|
|
|