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.

  • 🔘 Definition: Bei einer n-stelligen Zahl wird jede Ziffer mit n potenziert und die Ergebnisse werden addiert.
  • ☑️ Ausgearbeitetes Beispiel: 370 ist eine gültige Zahl, da 3³ plus 7³ plus 0³ genau 370 ergibt.
  • Digit Extraction: Der Modulo-Operator entfernt die letzte Ziffer, und die Ganzzahldivision verkürzt die Zahl bei jedem Durchlauf.
  • 🧪 Zwei Programme: Die eine Funktion prüft einen fest codierten Wert von 153, die andere durchläuft jede Zahl von 0 bis 999.
  • Bekannte Grenze: Das Kubieren jeder Ziffer funktioniert nur bei dreistelligen Werten, daher benötigt man für größere Bereiche die Potenz von n.
  • 📊 Komplexität: Beide Programme haben eine Laufzeit von O(d) pro Zahl und benötigen O(1) zusätzlichen Speicher.

Armstrong-Zahl in Java Programm, das eine for-Schleife verwendet

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.

  1. Kopieren Sie die Eingabe in ein Arbeitsverzeichnis. Variable Somit bleibt der ursprüngliche Wert für den abschließenden Vergleich erhalten.
  2. Nimm die letzte Ziffer mit dem Modulo-Operator, digit = tempNumber % 10.
  3. Erhöhe diese Ziffer mit der Ziffernanzahl und addiere sie zu einer laufenden Summe.
  4. Bei der Ganzzahldivision die letzte Ziffer weglassen. tempNumber /= 10.
  5. 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.

Häufig gestellte Fragen

Ja. Die dritte Potenz jeder Ziffer ergibt 27 + 343 + 1, was zusammen 371 ergibt. Der Wert wiederholt sich also. Das obige Programm gibt ihn zusammen mit 153, 370 und 407 aus.

Der Name spiegelt die Eigenschaft selbst wider: Die Zahl besteht vollständig aus ihren eigenen Ziffern und scheint somit ihr eigenes Spiegelbild zu bewundern. Beide Begriffe beschreiben dieselbe Regel, und die Ziffernpotenzsumme wird mitunter als plusperfekte Zifferninvariante bezeichnet.

Es gibt drei: 1634, 8208 und 9474. Jede Ziffer wird potenziert, da der Wert vier Stellen hat. Kubikbasierte Codes können diese Zahlen nicht erkennen, weshalb der Exponent der Ziffernanzahl entsprechen muss.

Eine vollkommene Zahl ist die Summe ihrer echten Teiler; so ist beispielsweise 6 eine vollkommene Zahl (1 + 2 + 3). Eine Armstrong-Zahl ist die Summe ihrer Ziffernpotenzen. Die beiden Definitionen haben keine arithmetischen Gemeinsamkeiten und überschneiden sich nur selten.

Math.pow() gibt einen Double-Wert zurück, daher ist eine Umwandlung zurück in int erforderlich, wodurch Rundungsfehler auftreten können. Bei festen Kuben ist die Multiplikation mit mehreren Ziffern (digit*digit*digit) schneller und genauer. Math.pow() ist nur dann sinnvoll, wenn der Exponent mit der Anzahl der Ziffern variiert.

Ja. Eine Hilfsmethode kann den Arbeitswert entgegennehmen, die letzte Ziffer des Potenzwertes zu einem Akkumulator addieren und sich selbst mit dem durch 10 geteilten Ergebnis aufrufen. Der Code ist gut lesbar, die Schleifenversion vermeidet jedoch die zusätzlichen Stack-Frames.

Moderne Assistenten können einen Pass-für-Pass-Prozess durchführen. trace) Formulieren Sie die Schleife in einfacher Sprache neu und schlagen Sie Grenzfälle wie 0 oder eine negative Eingabe vor. Überprüfen Sie die trace gegenüber der tatsächlichen Konsolenausgabe, da generierte Lösungswege gelegentlich eine Iteration überspringen.

GitHub-Copilot Die Schleife wird üblicherweise allein durch den Methodennamen vervollständigt, allerdings wird der Würfel oft fest codiert. Geben Sie die erforderliche Ziffernanzahl in der Aufgabenstellung an und kompilieren und testen Sie den Vorschlag, bevor Sie ihm vertrauen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: