Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, bin absoluter Anfänger und suche jemanden, der mir diesen Code erklärt. Also wie genau ein Ablauf aussieht. Leider konnte ich nichts passendes hier im Forum finden.
Code:
public class PerfekteZahl {
public static void main(String[]args) {
int teilersumme = 0;
int j = 1;
while(j != teilersumme) {
teilersumme = 0;
for(int i = j / 2; i > 0; i-- ) {
if(j % i == 0) {
teilersumme = teilersumme + i;
}
}
if(teilersumme == j) {
System.out.print(j + " = ");
for(int i = j / 2; i > 0; i-- ) {
if(j % i == 0) {
teilersumme = teilersumme + i;
System.out.print(i);
if(i != 1){
System.out.print(" + ");
}
}
}
System.out.println("");
}
j++;
}
}
}
Ja genau... jetzt setzt sich hier gaaanz bestimmt jemand hin, und erklärt für dich Zeile für Zeile den Code, und warum er an jeder Stelle so funktioniert, wie er funktioniert.
Hast du mal daran gedacht, das selber zu versuchen? Bzw., woran scheitert es denn genau?
Ganz nebenbei: Die Aussage "Ich bin absoluter Anfänger, also kann ich das nicht" zählt hierbei nicht.
Meine 1.Frage wäre schonmal, warum i=j/2 ist und nicht i=j und warum es i-- und nicht i++?
Danke für deine freundliche Art . Du wirst hier nicht gezwungen, zu antworten.
Weil hier von j/2 bis 1 herunter gezählt wird, um alle Teiler-Kandidaten zu durchlaufen. Man hätte stattdessen auch von 1 bis j/2 herauf zählen können. Dann wäre i++ richtig gewesen.
Mit jeder Iteration der while-Schleife wird ein neues j als Kandidat dafür, eine perfekte Zahl zu sein, untersucht. Dafür muß die Teilersumme von j ermittelt werden, die deshalb zunächst auf 0 gesetzt wird, weil darin ja noch die Teilersumme des vorherigen Kandidaten abgelegt ist.
Die Bedingung der while-Schleife scheint aber noch nicht ganz ausgereift zu sein.
Doch, eigentlich ist es erwünscht, wenn man es genau nehmen würde. Nach Definition gilt für eine eine Perfekte Zahl
, inklusive der Zahl selbst. Für n=6 wäre die Summe Ihrerer Teiler inkl. sich selbst 1+2+3+6 = 12 = 2 * 6. 6 ist damit eine Perfekte Zahl. Abgeleitet von dieser Definition ist jedoch ist jedoch Die Summe der Teiler von n exklusive n damit n. Daraus kann man ableiten, dass der nächstekleiner Teiler von n nach n nur halb so groß wie n sein kann. Daher beginnt die Schleife bei n/2 - im Code ist n ein wachsendes j.
Na ja, es entspricht nicht so ganz meinem Verständnis von "eigentlich ist es erwünscht", wenn ich zwar bereits das richtige Ergebnis habe, aber trotzdem noch einmal denselben Aufwand investiere, um es zu verdoppeln, damit ich durch anschließende Division mit zwei doch noch das bereits zuvor bekannte Resultat erreiche.
Die Definitionen sigma(n) = 2n und sigma*(n) = n sind äquivalent, von daher würde ich ersteres nicht "die", sondern "eine" Definition nennen und die erste ist auch nicht "genauer" als die zweite.