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.
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.
- Kopiera inmatningen till en fungerande variabel så det ursprungliga värdet finns kvar för den slutliga jämförelsen.
- Ta den sista siffran med modulooperatorn,
digit = tempNumber % 10. - Upphöj den siffran upphöjt till antalet siffror och lägg till den till en löpande summa.
- Ta bort den sista siffran med heltalsdivision,
tempNumber /= 10. - 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.
