Vollkommene Zahl berechnen und ausgeben

SimonOsiris

Mitglied
Hallo,

Ich versuche gerade folgende Aufgabenstellung zu lösen: "Schreiben Sie eine for-Schleife, welche überprüft, ob number eine "vollkommene" Zahl ist. Eine Zahl heißt dann vollkommen, wenn sie die Summe ihrer Teiler (außer sich selbst) ist. Trifft dies zu (wie z.B. bei 6 = 1 + 2 + 3), so ist der größte Teiler (bei der Zahl 6 wäre dies 3) auszugeben."

Momentan sieht mein Code so aus:Frage U6.PNG

Wie ihr sehen könnt nicht optimal da bei mir alle geraden Zahlen als vollkommene Zahl ausgegeben werden. Leider weiß ich gerade nicht mehr weiter wie ich mein Programm umschreiben kann, sodass nur Zahlen als vollkommene Zahl ausgegeben werden die die Summe ihrer Teiler sind.

Vielen dank im vorraus für eure Hilfe!
 

temi

Top Contributor
Bitte verwende die Codetags (das </> Symbol im Editor ganz links) anstatt von Screenshoots.

Überlege was du machen musst, um das Problem zu lösen, z. B. anhand des Beispiels oben. Du prüfst, ob 6 / 1 teilbar ist, falls ja, soll die aktuelle Summe (die am Anfang noch 0 ist) um den Wert des Teilers erhöht werden, also 0 + 1 = 1. Dann kommt der nächste Teiler. 6 / 2 ist teilbar, der Teiler ist 2, also aktuelle Summe 1 + 2 = 3, usw. Am Ende (also nach der Schleife) hast du die Summe und musst nur noch prüfen, ob diese gleich der Zahl ist. Falls ja brauchst du noch den Wert des letzten ermittelten Teilers (den du dir hoffentlich gemerkt hast).
 

SimonOsiris

Mitglied
Alles klar, dass hat mir glaube ich schon ein bisschen geholfen.
Jetzt sieht mein Code so aus:

Java:
import java.util.Scanner;
class Exercise {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int number = in.nextInt();

        // TODO Put your code here

        int i = 1;
        int teilersumme = 0;
        int finalesumme = 0;

        for (int n = number; teilersumme <= n; i++) {
            if (number % i == 0 && finalesumme != n) {
                teilersumme = teilersumme + i;
                finalesumme = finalesumme + teilersumme;

                    if (teilersumme == number) {
                        System.out.println("The number: " + number + " is a perfect number. greatest divisor: " + number/2);
                    }




            }
        }
    }
}

Ich denke ich brauche jetzt noch eine else Bedingung um anzugeben was ausgegeben wird number keine vollkommene Zahl ist? Allerdings schaffe ich es irgendwie nicht diese richtig in meinen Code zu implementieren.
 

KonradN

Super-Moderator
Mitarbeiter
Schau Dir noch einmal die Aussage von @temi an:
Am Ende (also nach der Schleife) hast du die Summe und musst nur noch prüfen, ob diese gleich der Zahl ist. Falls ja brauchst du noch den Wert des letzten ermittelten Teilers (den du dir hoffentlich gemerkt hast).

In der Schleife berechnest Du nur etwas. Nach der Schleife wertest Du das Ergebnis aus.
 

temi

Top Contributor
Mir erscheint deine Schleife unnötig kompliziert. Um die Teiler von 6 zu finden musst du doch nur und ganz simpel von 1 bis 5 der Reihe nach probieren, ob sich 6 ohne Rest damit teilen lässt for (int i = 1; i < 6; i++). Und immer, wenn du einen Teiler gefunden hast, musst du etwas machen. Kurz gesagt: die Laufvariable der Schleife ist der jeweilige Teiler.

EDIT: Nachdem ich die Schleife jetzt noch einmal eindringlich betrachtet habe, ist sie durchaus geeignet Kopfzerbrechen zu bereiten.

Die Laufvariable (n) wird zwar initialisiert, aber gar nicht sinnvoll verwendet und, anders als es mit Laufvariablen eigentlich passieren sollte, inkrementiert noch dekrementiert. Stattdessen wird eine außerhalb der Schleife deklarierte Variable (i) als zusätzliche Laufvariable verwendet und inkrementiert. Als Krönung wird eine dritte Laufvariable (teilersumme) verwendet, um die Abbruchbedingung zu bilden. Bist du Mitglied im Verein "confuse a cat"?
 
Zuletzt bearbeitet:

MarvinsDepression

Bekanntes Mitglied
Ich hab das mal mit einer bis zum Anschlag optimierten for-Schleife umgesetzt und dachte, der 'rechnet' mir jetzt in 2 Sekunden alle positiven int-Werte durch. Dachte ich...
Endlosschleife 🤦‍♂️
Man soll das Schicksal nicht herausfordern
Java:
    public void main() {
        for (int number = 1; number <= Integer.MAX_VALUE; number++) {
            if (isPerfect(number)) System.out.println(number +" is prefect");
        }
    }
    
    public boolean isPerfect(int number) {
        int[] perfectNumbers = new int[] {6, 28, 496, 8128, 33_550_336};
        for (int value : perfectNumbers) {
            if (value == number) return true;
        }
        return false;
    }
P.S.: Der Code ist natürlich Käse... 😁
 

SimonOsiris

Mitglied
Mir erscheint deine Schleife unnötig kompliziert.
Ja das stimmt leider, ich bin halt noch ein ziemlicher Anfänger und ich versuche dieses Beispiel so einfach wie möglich zu lösen. Allerdings zerbreche ich mir immer noch daran den Kopf und werde bei meinen Lösungsversuchen immer komplizierter.

Um die Teiler von 6 zu finden musst du doch nur und ganz simpel von 1 bis 5 der Reihe nach probieren, ob sich 6 ohne Rest damit teilen lässt for (int i = 1; i < 6; i++).
Laut Angabe muss ich doch aber überprüfen ob number eine volkommene Zahl ist und wenn ich das so mache dann geht es doch nur bis zur Zahl 6 oder? Wäre hier nicht zum Beispiel statt i < 6, i < number besser?

Und immer, wenn du einen Teiler gefunden hast, musst du etwas machen. Kurz gesagt: die Laufvariable der Schleife ist der jeweilige Teiler.
Meinst du so?
Java:
for (int i = 1; i < number; i++) {
            if (number % i == 0){

                int teiler = number / i;

Edit: Hab versucht über eure Antworten nochmal nachzudenken, allerdings hab ich glaub ich nicht immer verstanden was ihr meint. Durch eigenes herumprobieren hab ichs aber geschafft die Übung zu lösen. Mein Code sieht jetzt so aus:
Java:
public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int number = in.nextInt();

        // TODO Put your code here

        int i = 1;
        int teilersumme = 0;
        int finalesumme = 0;

        for (int n = number; teilersumme <= n; i++) {
            if (number % i == 0 && finalesumme != n) {
                teilersumme = teilersumme + i;
                finalesumme = finalesumme + teilersumme;

                    if (number == 6 || number == 28 || number == 496 || number == 8128 || number == 33550336) {
                        System.out.println("The number: " + number + " is perfect. greatest divisor: " + number/2);
                        break;
            } else if (teilersumme != number) {System.out.println("The number " + number + " is not perfect");}
                    break;




            }
        }
    }
}

Ist mir natürlich klar dass mein Code alles andere als super ist, allerdings bin ich schon einmal froh dass ich die Aufgabe geschafft habe, die ist nämlich bis morgen zum abgeben :,D
Habt ihr noch tipps wie ich meine Code besser bzw. leichter und übersichtlicher machen kann. Kann ich ein paar Sachen weglassen bzw. ersetzten?
 
Zuletzt bearbeitet:

temi

Top Contributor
Ja, fast richtig. Wenn sich number durch den Teiler i teilen lässt, dann musst du summe um den Wert des Teilers erhöhen (also um i). Diesen Satz kannst du direkt in eine if-Anweisung formulieren.
Ist mir natürlich klar dass mein Code alles andere als super ist
Eigentlich ist er das komplette Gegenteil von super. Es wurde doch zig-mal erwähnt, dass die Abfrage, ob es sich um eine vollkommene Zahl handelt NACH die Schleife sollte. Ist dir klar, wo "nach der Schleife" ist? Ernst gemeinte Frage.
Java:
for (int i=1; i < number; i++) { // hier beginnt der Schleifenrumpf
 
    // alles was hier steht ist innerhalb der Schleife
 
} // und hier endet er

Und einfach die ersten bekannten vollkommenen Zahlen abzufragen ist nicht die richtige Lösung des Problems. Da kannst du dir die ganze Schleife sparen.
 
Zuletzt bearbeitet:

MarvinsDepression

Bekanntes Mitglied
Dass Du Dich an meinem Code aus #8 orientierts, ist sicher nicht zielführend. Das war ein eher schlechter Scherz. Du sollst ja einen Algorithmus entwickeln, der eben diese Zahlen findet.
Das ist eigentlich auch nicht so schwierig:
  • Du musst alle echten Teiler einer Zahl finden
  • Die gefundenen Teiler müssen addiert werden
  • Die gebildete Summe zum Schluss mit der ursprünglichen Zahl vergleichen.
in #9 hast Du folgenden Code eingestellt
Java:
for (int i = 1; i < number; i++) {
    if (number % i == 0){

        int teiler = number / i;
und möchtest in Zeile 4 den Teiler berechnen, übersiehst aber dabei, dass i bereits ein echter Teiler ist (das sagt ja number % i == 0 aus).
Wenn Du jetzt bereits eine Variable für die TeilerSumme hättest, dann müsstest Du statt der Zeile 4 jetzt was machen?
 

berndoa

Top Contributor
Ich werfe jetzt einfahc mal noch meinen eigenen, vermutlich miesen, Vorschlag in den Raum:
eine variable maxTeiler einfpühren die den "aktuellen " höchsten Teiler speichert.
Und einen int Teilersumme, der einfahc die bisher gefundenen Teiler aufaddiert.

Wie erwähnt wurde, in einer for Schleife alle Zahlen von i=1 bis number-1 durchgehen.
in jedem durchlauf gucken ob i ein teiler von number ist.
Falls ja, maxTeiler aktualisieren.
und i zu Teilersumme addieren.


Muss man halt nur mit der 1 aufpassen.
ggbfls. Teilersumme und maxTeiler mit 1 initialisieren statt 0.
 

SimonOsiris

Mitglied
Hallo vielen dank nochmal für eure Hilfe, Unterstützung und Erklärungsversuche! :D

Dank berndoa seiner Antwort und durch das durchdenken der Musterlösung:
Java:
int sum = 0;
int greatestDivisor = 0;

for (int i = 1; i < number; i++) {
    if (0 == number % i) {
        sum += i;
        greatestDivisor = i;
    }
}

System.out.println("The number " + number + " is "
        + ((sum == number) ? "perfect. Greatest divisor: " + greatestDivisor
                           : "not perfect."));

habe ich die Aufgabe jetzt großteils verstanden. Wenn man weiß wies geht ist es wirklich sehr einfach und simpel. :/

Ich hätte noch eine kurze Frage zur printline am Ende des Codes. Bedeutet dieser Teil hier:
Code:
((sum == number) ?
dass "perfect. Greatest divisor: " nur geprinted wird wenn sum = number ist und wenn nicht bei : "not perfect" weitergeschrieben wird?
 

berndoa

Top Contributor
Hallo vielen dank nochmal für eure Hilfe, Unterstützung und Erklärungsversuche! :D

Dank berndoa seiner Antwort und durch das durchdenken der Musterlösung:
Java:
int sum = 0;
int greatestDivisor = 0;

for (int i = 1; i < number; i++) {
    if (0 == number % i) {
        sum += i;
        greatestDivisor = i;
    }
}

System.out.println("The number " + number + " is "
        + ((sum == number) ? "perfect. Greatest divisor: " + greatestDivisor
                           : "not perfect."));

habe ich die Aufgabe jetzt großteils verstanden. Wenn man weiß wies geht ist es wirklich sehr einfach und simpel. :/

Ich hätte noch eine kurze Frage zur printline am Ende des Codes. Bedeutet dieser Teil hier:
Code:
((sum == number) ?
dass "perfect. Greatest divisor: " nur geprinted wird wenn sum = number ist und wenn nicht bei : "not perfect" weitergeschrieben wird?
Yo.
Java:
Bedingung?A:B
ist das Selbe wie

Code:
if(Bedingung){A}
else{B}

Also wenn Bedingugn erfüllt wird A gemacht ansonsten B.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vollkommene Zahlen: Findet keine Einzige Java Basics - Anfänger-Themen 9
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
B Überprüfung dass Zahl nur aus 0,1 besteht Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
B 49-bit-zahl mit genau 6 Einsen bauen? Java Basics - Anfänger-Themen 21
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
M Java Ausgabe der höchsten Zahl Java Basics - Anfänger-Themen 14
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
M zahl raten Java Basics - Anfänger-Themen 1
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
I Zahl aufrunden (Zeit) Java Basics - Anfänger-Themen 43
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
R Fortlaufende Zahl Java Basics - Anfänger-Themen 3
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
HelpInneed Zahl. Java Basics - Anfänger-Themen 2
R Perfekte Zahl Java Basics - Anfänger-Themen 8
D Mittlerste Zahl Java Basics - Anfänger-Themen 17
D Grösste Zahl in einer Folge herausfinden. (ULAM) Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
J Verdoppeln einer Zahl (in dem Fall Münzen) Java Basics - Anfänger-Themen 4
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
K Wie kontrolliere ich ob ich die Zahl in meinem Array schon hab? Java Basics - Anfänger-Themen 9
T Zahl in Array ersetzen Java Basics - Anfänger-Themen 2
Abraham42 Prozentsatz einer Zahl mehrmals Java Basics - Anfänger-Themen 2
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
V Beliebige Dreistellige Zahl Teiler finden Java Basics - Anfänger-Themen 4
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
W Random Zahl unter Berücksichtung eines Durchschnitts Java Basics - Anfänger-Themen 7
S Zahl eingeben Java Basics - Anfänger-Themen 8
A Java . punkt neben einer Zahl. Java Basics - Anfänger-Themen 1
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
J Die größte Zahl anzeigen Java Basics - Anfänger-Themen 19
V Array auf eine Zahl durchsuchen Java Basics - Anfänger-Themen 15
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
L Erhöhung der Zahl Java Basics - Anfänger-Themen 3
F Negative Zahl erzwingen Java Basics - Anfänger-Themen 3
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
T Eulersche Zahl e Java Basics - Anfänger-Themen 5
S Letzte Zahl eines Integer auslesen? Java Basics - Anfänger-Themen 3
G Programm schreiben: Zahl (n) eingeben, 1+1/n+2/n+3/n+....+n/n Java Basics - Anfänger-Themen 8
B Eine ganze Zahl zerlegen. Java Basics - Anfänger-Themen 4
J Fehler beim generieren von 4 Zufallszahlen Zahl doppelt ist eigentlich ausgeschlossen Java Basics - Anfänger-Themen 9
H Harshad-Zahl (Nivenzahl) und Palindrom überprüfen Java Basics - Anfänger-Themen 2
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
A Gewürfelte Zahl ausgeben Java Basics - Anfänger-Themen 10
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
A Überprüfen, ober eine Zahl Ziffer enthält Java Basics - Anfänger-Themen 12
O Markoff-Zahl Java Basics - Anfänger-Themen 22
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
L 10-Stellige Zahl hochzählen lassen Java Basics - Anfänger-Themen 1
H String und Zahl Java Basics - Anfänger-Themen 10
R Zahl 1 bis 100 erraten Java Basics - Anfänger-Themen 12
Y Konkrete Hilfe gesucht - Anzahl der Stellen einer eingegebenen Zahl überprüfen Java Basics - Anfänger-Themen 5
J Button klick bei eine bestimmten Zahl Java Basics - Anfänger-Themen 8
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
J Für jeden Buchstaben eine Zahl Java Basics - Anfänger-Themen 1
H Würfelspiel, stop bei gleicher Zahl Java Basics - Anfänger-Themen 4
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
I Erste Schritte Testen, ob eine Zahl eine Primzahl ist Java Basics - Anfänger-Themen 8
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
I Eulersche Zahl Java Basics - Anfänger-Themen 6
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
J Die Zahl herausfinden die durch 2 - 30 Teilbar ist... Java Basics - Anfänger-Themen 17
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
T Datentypen char als Buchstaben statt als Zahl ausgeben Java Basics - Anfänger-Themen 4
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
H 32-Bit Zahl (Integer) in eine IPv4 Adresse umwandeln? Java Basics - Anfänger-Themen 2
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
D String erste Zahl mit LKZ auslesen lassen Java Basics - Anfänger-Themen 36
C Erste Ziffer einer Zahl Java Basics - Anfänger-Themen 46
M Zeilenumbruch ab der 10. Zahl Java Basics - Anfänger-Themen 11
T Input/Output Int Eingabe auf Zahl überprüfen Java Basics - Anfänger-Themen 30
R Input/Output zahl aus showInputDialog() Java Basics - Anfänger-Themen 25
D Die Zahl in der Mitte finden Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben