Armstrong-nummer in JAVA-programma met behulp van For-lus

⚡ Slimme samenvatting

Armstrong-getallen zijn gelijk aan de som van hun eigen cijfers verhoogd tot de macht van het aantal cijfers, en de twee Java De onderstaande programma's controleren één enkele waarde en geven een lijst van alle Armstrong-getallen onder de duizend.

  • 🔘 Definitie: Bij een getal van n cijfers wordt elk cijfer tot de macht n verheven en worden de resultaten bij elkaar opgeteld.
  • ☑️ Uitgewerkt voorbeeld: 370 voldoet aan de criteria omdat 3³ plus 7³ plus 0³ precies 370 oplevert.
  • ✅ Digit Extractie: De modulo-operator verwijdert het laatste cijfer en gehele deling verkort het getal bij elke stap.
  • 🧪 Twee programma's: De ene test een vastgelegde waarde van 153, de andere doorloopt elk getal van 0 tot 999.
  • ️ Bekende limiet: Het verheffen van elk cijfer tot de derde macht werkt alleen voor getallen van drie cijfers; voor grotere bereiken is de macht van n nodig.
  • 📊 complexiteit: Beide programma's hebben een looptijd van O(d) per getal en gebruiken O(1) extra geheugen.

Armstrong-nummer in Java programma met behulp van een for-lus

Wat is het Armstrong-getal?

Bij een Armstrong-getal is de som van de machten van de afzonderlijke cijfers gelijk aan het getal zelf.

Met andere woorden, de volgende vergelijking zal waar zijn

xy..z = xn + yn+.....+ zn

n is het aantal cijfers in getal

Dit is bijvoorbeeld een 3-cijferig Armstrong-nummer

370 = 33 + 73 + 03
 = 27 + 343 + 0
 = 370

Voorbeelden van Armstrong Numbers

0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.

Elk getal van 0 tot en met 9 voldoet triviaal aan de regel, omdat een getal van 0 tot de macht 1 zichzelf teruggeeft. De complete set van driecijferige Armstrong-getallen bestaat uit 153, 370, 371 en 407, terwijl 1634, 8208 en 9474 de viercijferige getallen zijn. Wiskundigen noemen deze getallen ook wel narcistische getallen, omdat elk getal zichzelf reproduceert uit zijn eigen cijfers.

Laten we dit in een programma schrijven:

Hoe het Armstrong-nummeralgoritme werkt

Voordat je de code leest, is het handig om de rekenkundige bewerkingen te bekijken die beide programma's herhalen. De controle vereist slechts drie bewerkingen: het laatste cijfer verwijderen, het getal tot de vereiste macht verheffen en het getal met één cijfer verkleinen.

  1. Kopieer de invoer naar een werkend bestand. variabele De oorspronkelijke waarde blijft dus behouden voor de uiteindelijke vergelijking.
  2. Neem het laatste cijfer met de modulo-operator. digit = tempNumber % 10.
  3. Verhoog dat cijfer tot de macht van het aantal cijfers en tel het op bij een doorlopend totaal.
  4. Verwijder het laatste cijfer bij gehele deling. tempNumber /= 10.
  5. Herhaal dit totdat de werkvariabele 0 bereikt en vergelijk vervolgens het lopende totaal met het oorspronkelijke getal.

Als je die stappen 153 keer herhaalt, krijg je het volgende resultaat: trace hieronder. Elke waarde in de tabel wordt door het eerste programma afgedrukt, zodat de uitvoer regel voor regel kan worden vergeleken tijdens het leren van de lus.

Passeren tijdelijk nummer cijfer cijferKubiekeSom
1 153 3 27
2 15 5 152
3 1 1 153
afrit 0 - 153 is gelijk aan 153, dus 153 is een Armstrong-getal.

Een belangrijke beperking. Beide programma's vermenigvuldigen het cijfer driemaal met zichzelf, wat alleen de juiste macht is als de invoer precies drie cijfers bevat. De algemene regel is om elk cijfer tot de macht n te verheffen, waarbij n het aantal cijfers is. Een waarde van vier cijfers, zoals 8208, vereist dus een vierde macht en zou door code gebaseerd op de derdemacht over het hoofd worden gezien. Door eerst de cijfers te tellen en elk cijfer tot die macht te verheffen, wordt de routine een algemene test.

Nadat de berekeningen duidelijk zijn, past het eerste programma ze toe op één enkele, vastgelegde waarde.

Java Programma om te controleren of een getal een Armstrong-getal is

De onderstaande klasse slaat de kandidaat op in inputArmstrongNumber en print de werkvariabelen bij elke doorgang, wat de Java Een lus die gemakkelijk te volgen is in een console.

//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");
	}
}

Compileer en voer de klasse uit vanuit de projectmap. Omdat het bestand declareert... package com.guru99Het moet op een bijpassende plek passen. com/guru99 map, of de runtime meldt een klasse-niet-gevonden-fout. Het wijzigen van de waarde op de inputArmstrongNumber Een lijn is alles wat nodig is om een ​​andere kandidaat te testen.

uitgang

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

Het controleren van één waarde tegelijk is handig voor tracing, maar dezelfde logica is door middel van wrapper toepasbaar op een heel bereik.ping het in een buitenste lus.

Java Programma om Armstrong-getallen van 0 tot 999 af te drukken

De tweede versie behoudt identieke interne structuren. while lus en voegt een toe for Een lus die het bereik doorloopt. Merk op dat digitCubeSum wordt aan het begin van elke doorgang teruggezet naar 0, een detail dat de meeste beginners over het hoofd zien.

//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");
        }
    }
}

uitgang

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

De lijst stopt bij 1 in plaats van door te gaan tot 9, omdat de kubus van een enkel cijfer alleen overeenkomt met het cijfer zelf voor 0 en 1. Als we elk cijfer tot de macht van het aantal cijfers verheffen, krijgen we alle tien de waarden van één cijfer, wat dezelfde generalisatie is als eerder beschreven.

Beide aanbiedingen zijn kort genoeg om als referentiepunt te dienen, dus het is de moeite waard om de kosten van de aanpak expliciet te vermelden.

Tijd- en ruimtecomplexiteit van het Armstrong-nummerprogramma

De binnenste lus deelt de variabele bij elke iteratie door 10, waardoor de berekening één keer per cijfer wordt uitgevoerd in plaats van één keer per eenheid van het getal. Daardoor is de controle op de enkele waarde extreem efficiënt, en blijft deze efficiënt naarmate de invoer groter wordt.

Programma Tijdcomplexiteit Ruimtecomplexiteit
Vink één nummer aan O(d), waarbij d het aantal cijfers is. O (1)
Scan een reeks van N getallen O(N × d) O (1)

Omdat d gelijk is aan logaritme10(getal) naar boven afgerond, de enkele controle is in feite logaritmisch in de te testen waarde. Slechts drie int Variabelen worden nooit toegewezen en er wordt geen array of collectie aangemaakt, waardoor de ruimtekosten constant blijven, ongeacht hoe groot het bereik wordt.

Hieruit volgen twee praktische opmerkingen. Ten eerste wordt de bereikscan gedomineerd door N, dus het afdrukken van Armstrong-nummers tot een miljoen kost ongeveer duizend keer meer dan het afdrukken ervan tot duizend. Ten tweede, een int overschrijdt de limiet boven 2,147,483,647, dus een zoekopdracht over zeer grote bereiken is nodig. long voor zowel de kandidaat als de lopende som. Dezelfde cijfer-extracHet tion-patroon komt voor in veel oefeningen voor beginners, waaronder de priemgetalcontrole Fibonacci-reeks programma- en array-oefeningen zoals bellen sorteren en invoegsoort.

Veelgestelde vragen

Ja. Als je elk cijfer tot de derde macht verheft, krijg je 27 plus 343 plus 1, wat optelt tot 371, dus de waarde reproduceert zichzelf. Het bovenstaande bereikprogramma print het samen met 153, 370 en 407.

De naam weerspiegelt de eigenschap zelf: het getal is volledig opgebouwd uit zijn eigen cijfers, waardoor het lijkt alsof het zijn eigen spiegelbeeld bewondert. Beide termen beschrijven dezelfde regel, en de som van de cijfers en machten wordt soms een plus-perfecte digitale invariant genoemd.

Er zijn er drie: 1634, 8208 en 9474. Elk cijfer wordt tot de vierde macht verheven omdat de waarde vier cijfers heeft. Kubusgebaseerde codes kunnen ze niet detecteren, daarom moet de exponent na het aantal cijfers komen.

Een perfect getal is gelijk aan de som van zijn echte delers, dus 6 voldoet aan de criteria via 1 plus 2 plus 3. Een Armstrong-getal is gelijk aan de som van zijn machten. De twee definities hebben geen rekenkundige overeenkomsten en overlappen elkaar zelden.

Math.pow() retourneert een double, dus een typeconversie naar int is nodig en afrondingsfouten zijn mogelijk. Voor een vaste kubus is digit*digit*digit sneller en nauwkeuriger. Math.pow() is alleen zinvol als de exponent varieert met het aantal cijfers.

Ja. Een hulpfunctie kan de werkwaarde nemen, het laatste cijfer tot de macht verheven optellen bij een accumulator en zichzelf aanroepen met het getal gedeeld door 10. Het is goed leesbaar, hoewel de lusversie de extra stackframes vermijdt.

Moderne assistenten kunnen een stapsgewijze handleiding produceren. trace. Herschrijf de lus in eenvoudige taal en geef voorbeelden van randgevallen, zoals 0 of een negatieve invoer. Controleer de trace tegen de werkelijke console-uitvoer, omdat gegenereerde stappenplannen soms een iteratie overslaan.

GitHub-copiloot Meestal wordt de lus voltooid op basis van de methodenaam alleen, maar vaak wordt de kubus hardgecodeerd. Geef het vereiste aantal cijfers aan in de prompt, compileer en test de suggestie voordat u erop vertrouwt.

Vat dit bericht samen met: