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.
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.
- Kopieer de invoer naar een werkend bestand. variabele De oorspronkelijke waarde blijft dus behouden voor de uiteindelijke vergelijking.
- Neem het laatste cijfer met de modulo-operator.
digit = tempNumber % 10. - Verhoog dat cijfer tot de macht van het aantal cijfers en tel het op bij een doorlopend totaal.
- Verwijder het laatste cijfer bij gehele deling.
tempNumber /= 10. - 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.
