Armstrong-Zahl im JAVA-Programm mithilfe einer For-Schleife
⚡ Intelligente Zusammenfassung
Armstrong-Zahlen entsprechen der Summe ihrer eigenen Ziffern, potenziert mit der Ziffernanzahl, und die beiden Java Die folgenden Programme prüfen jeweils einen einzelnen Wert und listen alle Armstrong-Zahlen unter eintausend auf.
Was ist die Armstrong-Zahl?
Bei einer Armstrong-Zahl ist die Summe der Potenzen der einzelnen Ziffern gleich der Zahl selbst.
Mit anderen Worten gilt die folgende Gleichung
xy..z = xn + yn+.....+ zn
n ist die Anzahl der Ziffern in der Zahl
Dies ist beispielsweise eine dreistellige Armstrong-Nummer
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Beispiele für Armstrong Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Alle einstelligen Zahlen von 0 bis 9 erfüllen die Regel trivial, da eine einstellige Zahl potenziert sich selbst ergibt. Die vollständige Menge der dreistelligen Armstrong-Zahlen lautet 153, 370, 371 und 407, während 1634, 8208 und 9474 die vierstelligen sind. Mathematiker bezeichnen diese Zahlen auch als narzisstische Zahlen, da sich jede von ihnen aus ihren eigenen Ziffern selbst reproduziert.
Schreiben wir das in ein Programm:
Wie der Armstrong-Zahlen-Algorithmus funktioniert
Bevor man den Code liest, ist es hilfreich, die Rechenoperationen zu betrachten, die beide Programme wiederholen. Die Überprüfung benötigt nur drei Schritte: die letzte Ziffer entfernen, das Ergebnis mit dem erforderlichen Exponenten potenzieren und die Zahl um eine Stelle kürzen.
- Kopieren Sie die Eingabe in ein Arbeitsverzeichnis. Variable Somit bleibt der ursprüngliche Wert für den abschließenden Vergleich erhalten.
- Nimm die letzte Ziffer mit dem Modulo-Operator,
digit = tempNumber % 10. - Erhöhe diese Ziffer mit der Ziffernanzahl und addiere sie zu einer laufenden Summe.
- Bei der Ganzzahldivision die letzte Ziffer weglassen.
tempNumber /= 10. - Wiederholen Sie den Vorgang, bis die Arbeitsvariable den Wert 0 erreicht, und vergleichen Sie dann die Zwischensumme mit dem ursprünglichen Wert.
Wenn man diese Schritte 153 Mal ausführt, erhält man Folgendes: tracSiehe unten. Jeder Wert in der Tabelle wird vom ersten Programm ausgegeben, sodass die Ausgabe Zeile für Zeile verglichen werden kann, während man die Schleife lernt.
| Passieren | tempNumber | Ziffer | digitCubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Beenden | 0 | - | 153 ist gleich 153, also ist 153 eine Armstrong-Zahl. |
Eine wichtige Einschränkung. Beide Programme multiplizieren die Ziffer dreimal mit sich selbst, was nur dann die korrekte Potenzierung ist, wenn die Eingabe genau drei Ziffern hat. Die allgemeine Regel potenziert jede Ziffer mit n, wobei n die Anzahl der Ziffern ist. Ein vierstelliger Wert wie 8208 benötigt daher eine vierte Potenzierung und würde von einem auf Kuben basierenden Code nicht erkannt werden. Indem man die Ziffern zuerst zählt und jede mit ihrer jeweiligen Potenz potenziert, wird die Routine zu einem allgemeinen Test.
Nachdem die Arithmetik geklärt ist, wendet das erste Programm sie auf einen einzelnen, fest codierten Wert an.
Java Programm zum Überprüfen, ob eine Zahl eine Armstrong-Zahl ist
Die unten stehende Klasse speichert den Kandidaten in inputArmstrongNumber und gibt bei jedem Durchlauf die Arbeitsvariablen aus, was die Java Eine Schleife, die in der Konsole leicht nachzuvollziehen ist.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int inputArmstrongNumber = 153; //Input number to check armstrong int tempNumber, digit, digitCubeSum = 0; tempNumber = inputArmstrongNumber; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ System.out.println("Current Number is "+tempNumber); digit =tempNumber % 10; System.out.println("Current Digit is "+digit); //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit*digit*digit; System.out.println("Current digitCubeSum is "+digitCubeSum); tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if(digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); else System.out.println(inputArmstrongNumber + " is not an Armstrong Number"); } }
Kompilieren und führen Sie die Klasse im Projektverzeichnis aus. Denn die Datei deklariert package com.guru99Es muss in einem passenden com/guru99 Wenn der Ordner nicht gefunden wird oder die Laufzeitumgebung einen Klassenfehler meldet, wird der Wert geändert. inputArmstrongNumber Eine Zeile genügt, um einen weiteren Kandidaten zu testen.
Ausgang
Current Number is 153 Current Digit is 3 Current digitCubeSum is 27 Current Number is 15 Current Digit is 5 Current digitCubeSum is 152 Current Number is 1 Current Digit is 1 Current digitCubeSum is 153 153 is an Armstrong Number
Die Überprüfung jeweils eines Wertes ist nützlich für tracing, aber dieselbe Logik lässt sich durch Wrap auf einen ganzen Bereich skalieren.ping es in einer äußeren Schleife.
Java Programm zum Drucken von Armstrong-Zahlen von 0 bis 999
Die zweite Version behält das identische Innere bei. while Schleife und fügt ein for Schleife, die den Bereich durchläuft. Beachte, dass digitCubeSum wird zu Beginn jedes Durchlaufs auf 0 zurückgesetzt, ein Detail, das die meisten Anfänger vergessen.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int tempNumber, digit, digitCubeSum; for (int inputArmstrongNumber = 0; inputArmstrongNumber < 1000; inputArmstrongNumber++) { tempNumber = inputArmstrongNumber; digitCubeSum = 0; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ digit = tempNumber % 10; //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit * digit * digit; tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if (digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); } } }
Ausgang
0 is an Armstrong Number 1 is an Armstrong Number 153 is an Armstrong Number 370 is an Armstrong Number 371 is an Armstrong Number 407 is an Armstrong Number
Die Auflistung endet bei 1 und nicht bis 9, da die Kubikzahl einer einzelnen Ziffer nur bei 0 und 1 der Ziffer selbst entspricht. Würde man stattdessen jede Ziffer mit der Ziffernanzahl potenzieren, ergäbe sich jeder Wert von zehn einstelligen Ziffern, was der bereits beschriebenen Verallgemeinerung entspricht.
Beide Auflistungen sind kurz genug, um als Vergleichsmaßstab zu dienen, daher lohnt es sich, die Kosten des Ansatzes explizit anzugeben.
Zeit- und Speicherkomplexität des Armstrong-Zahlenprogramms
Die innere Schleife teilt die Arbeitsvariable bei jedem Durchlauf durch 10, sodass sie einmal pro Ziffer und nicht einmal pro Einheit der Zahl ausgeführt wird. Dadurch wird die Einzelwertprüfung extrem effizient, und diese Effizienz bleibt auch bei wachsenden Eingabewerten erhalten.
| Programm | Zeitliche Komplexität | Raumkomplexität |
| Eine Nummer ankreuzen | O(d), wobei d die Anzahl der Ziffern ist. | O (1) |
| Scannen Sie einen Bereich von N Zahlen | O(N × d) | O (1) |
Weil d gleich log ist10(Zahl) aufgerundet, ist die einzelne Prüfung effektiv logarithmisch in Bezug auf den zu prüfenden Wert. Nur drei int Es werden immer nur Variablen zugewiesen und keine Arrays oder Sammlungen erstellt. Deshalb bleiben die Speicherkosten konstant, egal wie groß der Bereich wird.
Daraus ergeben sich zwei praktische Schlussfolgerungen. Erstens wird der Bereichsscan von N dominiert, daher kostet das Drucken von Armstrong-Zahlen bis zu einer Million etwa tausendmal mehr als das Drucken bis zu tausend. Zweitens, ein int Überläufe oberhalb von 2,147,483,647 erfordern daher eine Suche über sehr große Bereiche hinweg long sowohl für den Kandidaten als auch für die laufende Summe. Die gleiche Ziffern-ExtracDas tionsmuster taucht in vielen Anfängerübungen auf, einschließlich der Primzahlprüfung, hat das Fibonacci-Serie Programm- und Array-Übungen wie Blase sortieren und Sortieren durch Einfügen.
