Armstrong-nummer i JAVA-program som använder For Loop

⚡ Smart sammanfattning

Armstrongtalen är lika med summan av sina egna siffror upphöjda till sifferantalets potens, och de två Java Programmen nedan kontrollerar ett enda värde och listar alla Armstrong-tal under tusen.

  • 🔘 Definition: För ett n-siffrigt tal upphöjs varje siffra till potensen n och resultaten läggs ihop.
  • ☑️ Utarbetat exempel: 370 kvalificerar eftersom 3³ plus 7³ plus 0³ returnerar exakt 370.
  • Digit Extraction: Modulooperatorn skalar bort den sista siffran och heltalsdivision förkortar talet vid varje genomgång.
  • 🧪 Två program: Den ena testar ett hårdkodat värde på 153, den andra loopar igenom alla tal från 0 till 999.
  • 🛠️ Känd gräns: Att kuba varje siffra fungerar bara för tresiffriga värden, så bredare intervall behöver potensen n.
  • 📊 Komplexitet: Båda programmen körs i O(d) tid per tal och använder O(1) extra minne.

Armstrong-nummer i Java program som använder en for-loop

Vad är Armstrong-nummer?

I ett Armstrong-tal är summan av potensen av enskilda siffror lika med talet självt.

Med andra ord kommer följande ekvation att stämma

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

n är antalet siffror i antalet

Detta är till exempel ett 3-siffrigt Armstrong-nummer

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

Exempel på Armstrong Numbers

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

Varje ensiffrigt värde från 0 till 9 uppfyller regeln trivialt, eftersom ett ensiffrigt tal upphöjt till potensen ett returnerar sig självt. Den kompletta mängden tresiffriga Armstrong-tal är 153, 370, 371 och 407, medan 1634, 8208 och 9474 är de fyrsiffriga elementen. Matematiker kallar också dessa värden för narcissistiska tal, eftersom vart och ett reproducerar sig självt från sina egna siffror.

Låt oss skriva detta i ett program:

Hur Armstrong-talalgoritmen fungerar

Innan man läser koden är det bra att se den aritmetik som båda programmen upprepar. Kontrollen behöver bara tre operationer: skala bort den sista siffran, höj den till önskad potens och förkorta talet med en plats.

  1. Kopiera inmatningen till en fungerande variabel så det ursprungliga värdet finns kvar för den slutliga jämförelsen.
  2. Ta den sista siffran med modulooperatorn, digit = tempNumber % 10.
  3. Upphöj den siffran upphöjt till antalet siffror och lägg till den till en löpande summa.
  4. Ta bort den sista siffran med heltalsdivision, tempNumber /= 10.
  5. Upprepa tills arbetsvariabeln når 0, jämför sedan den löpande summan med det ursprungliga talet.

Att köra dessa steg över 153 producerar trace nedan. Varje värde i tabellen skrivs ut av det första programmet, så utdata kan matchas rad för rad medan loopen lärs in.

Pass tempNumber siffra sifferKubSumma
1 153 3 27
2 15 5 152
3 1 1 153
Utgång 0 - 153 är lika med 153, så 153 är ett Armstrongtal

En viktig begränsning. Båda programmen multiplicerar siffran med sig själv tre gånger, vilket är den korrekta potensen endast när inmatningen har exakt tre siffror. Den allmänna regeln upphöjer varje siffra till potensen n, där n är antalet siffror, så ett fyrsiffrigt värde som 8208 behöver en fjärdepotens och skulle missas av kubbaserad kod. Att räkna siffrorna först och upphöja var och en till den potensen är det som gör rutinen till ett generellt test.

När aritmetiken är klar tillämpar det första programmet den på ett enda hårdkodat värde.

Java Program för att kontrollera om ett nummer är Armstrong Number

Klassen nedan lagrar kandidaten i inputArmstrongNumber och skriver ut arbetsvariablerna vid varje pass, vilket gör att Java loop som är lätt att följa i en konsol.

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

Kompilera och kör klassen från projektets rotfil. Eftersom filen deklarerar package com.guru99, den måste sitta i en matchande com/guru99 mappen, eller så rapporterar körningsmiljön ett felmeddelande om att klassen inte hittades. Ändra värdet på inputArmstrongNumber linje är allt som behövs för att testa en annan kandidat.

Produktion

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

Att kontrollera ett värde i taget är användbart för tracing, men samma logik skalar till ett helt intervall genom att radbrytaping den i en yttre slinga.

Java Program för att skriva ut Armstrong-nummer från 0 till 999

Den andra versionen behåller samma inre while loop och lägger till en for slinga som går över banan. Observera att digitCubeSum återställs till 0 i början av varje pass, vilket är den detalj som de flesta nybörjare glömmer.

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

Produktion

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

Listningen slutar vid 1 istället för att fortsätta till 9 eftersom kuben av en ensiffrig siffra bara matchar själva siffran för 0 och 1. Om man istället höjer varje siffra upphöjs till antalet siffror skulle alla tio ensiffriga värden returneras, vilket är samma generalisering som beskrivits tidigare.

Båda listorna är tillräckligt korta för att kunna jämföras, så kostnaden för metoden är värd att ange explicit.

Armstrong-nummerprogrammets tids- och rumskomplexitet

Den inre loopen dividerar arbetsvariabeln med 10 vid varje omgång, så den körs en gång per siffra istället för en gång per enhet av talet. Det gör envärdeskontrollen extremt billig, och den förblir billig allt eftersom indatamängden ökar.

Prográmma Tidskomplexitet Rymdkomplexitet
Markera ett nummer O(d), där d är sifferantalet O (1)
Skanna ett intervall med N tal O(N × d) O (1)

Eftersom d är lika med logaritmen10(tal) avrundat uppåt, är den enskilda kontrollen i praktiken logaritmisk i det värde som testas. Endast tre int variabler allokeras någonsin, och ingen array eller samling skapas, vilket är anledningen till att utrymmeskostnaden förblir konstant oavsett hur stort intervallet blir.

Två praktiska anmärkningar följer av detta. För det första domineras avståndsskanningen av N, så att skriva ut Armstrong-tal upp till en miljon kostar ungefär tusen gånger mer än att skriva ut dem upp till tusen. För det andra, en int överskrider 2 147 483 647, så en sökning över mycket stora intervall kräver long för både kandidaten och den löpande summan. Samma siffra-exempeltractionsmönstret förekommer i många nybörjarövningar, inklusive kontroll av primtal, den Fibonacci-serien program- och arrayövningar som bubbelsorter och insättningssortering.

Vanliga frågor

Ja. Att ta varje siffra i tredje grad ger 27 plus 343 plus 1, vilket ger 371, så värdet reproducerar sig självt. Intervallprogrammet ovan skriver ut det bredvid 153, 370 och 407.

Namnet återspeglar själva egenskapen: talet är helt uppbyggt av sina egna siffror, så det verkar beundra sin egen reflektion. Båda termerna beskriver samma regel, och sifferpotenssumman kallas ibland en pluskvamperfekt digital invariant.

Det finns tre: 1634, 8208 och 9474. Varje siffra upphöjs till fjärde potensen eftersom värdet har fyra siffror. Kubbaserad kod kan inte detektera dem, vilket är anledningen till att exponenten måste följa sifferräkningen.

Ett perfekt tal är lika med summan av dess delare, så 6 kvalificerar sig genom 1 plus 2 plus 3. Ett Armstrong-tal är lika med summan av dess sifferpotenser. De två definitionerna delar ingen aritmetik och överlappar sällan varandra.

Math.pow() returnerar en dubbel, så en återgång till heltal krävs och avrundningsfel blir möjliga. För en fast kub är digit*digit*digit snabbare och exakt. Math.pow() förtjänar sin plats endast när exponenten varierar med antalet siffror.

Ja. En hjälpmetod kan ta arbetsvärdet, lägga till den sista siffran med power till en ackumulator och anropa sig själv med talet dividerat med 10. Den läser bra, även om loopversionen undviker de extra stackframes.

Moderna assistenter kan producera en pass-by-pass trace, omformulera loopen i enkelt språk och föreslå kantfall som 0 eller en negativ ingång. Verifiera trace mot verklig konsolutdata, eftersom genererade genomgångar ibland hoppar över en iteration.

GitHub Copilot slutför vanligtvis loopen enbart från metodnamnet, men den hårdkodar ofta kuben. Ange kravet på sifferantal i prompten, kompilera och testa sedan förslaget innan du litar på det.

Sammanfatta detta inlägg med: