Armstrong-nummer i JAVA-program, der bruger For Loop
⚡ Smart opsummering
Armstrong-tal er lig med summen af deres egne cifre opløftet i potensen af cifferantal, og de to Java Programmerne nedenfor kontrollerer en enkelt værdi og angiver alle Armstrong-tal under tusind.

Hvad er Armstrong nummer?
I et Armstrong-tal er summen af potens af individuelle cifre lig med selve tallet.
Med andre ord vil den følgende ligning holde stik
xy..z = xn + yn+.....+ zn
n er antallet af cifre i antallet
Dette er for eksempel et 3-cifret Armstrong-nummer
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Eksempler på Armstrong Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Enhver encifret værdi fra 0 til 9 opfylder reglen trivielt, fordi et encifret tal opløftet i potensen én returnerer sig selv. Det komplette sæt af trecifrede Armstrong-tal er 153, 370, 371 og 407, mens 1634, 8208 og 9474 er de firecifrede medlemmer. Matematikere kalder også disse værdier for narcissistiske tal, da hvert tal reproducerer sig selv fra sine egne cifre.
Lad os skrive dette i et program:
Hvordan Armstrong-talalgoritmen fungerer
Før man læser koden, er det en god idé at se den regnemåde, som begge programmer gentager. Kontrollen kræver kun tre operationer: pil det sidste ciffer af, opløft det til den ønskede potens, og forkort tallet med én plads.
- Kopier inputtet til en fungerende variabel så den oprindelige værdi bevares til den endelige sammenligning.
- Tag det sidste ciffer med modulo-operatoren,
digit = tempNumber % 10. - Opløft det ciffer op i potensen af cifferantallet og læg det til en løbende total.
- Fjern det sidste ciffer med heltalsdivision,
tempNumber /= 10. - Gentag indtil arbejdsvariablen når 0, og sammenlign derefter den løbende total med det oprindelige tal.
At køre disse trin over 153 producerer trace nedenfor. Hver værdi i tabellen udskrives af det første program, så outputtet kan matches linje for linje, mens løkken læres.
| Pass | tempNummer | ciffer | cifferKubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Udgang | 0 | - | 153 er lig med 153, så 153 er et Armstrong-tal |
En vigtig begrænsning. Begge programmer ganger cifferet med sig selv tre gange, hvilket kun er den korrekte potens, når inputtet har præcis tre cifre. Den generelle regel opløfter hvert ciffer til potensen n, hvor n er antallet af cifre, så en firecifret værdi som 8208 kræver en fjerde potens og ville blive overset af terningbaseret kode. At tælle cifrene først og opløfte hvert ciffer til den potens er det, der gør rutinen til en generel test.
Når aritmetikken er klar, anvender det første program den på en enkelt hardkodet værdi.
Java Program til at kontrollere, om et nummer er Armstrong-nummer
Klassen nedenfor gemmer kandidaten i inputArmstrongNumber og udskriver arbejdsvariablerne ved hver gennemgang, hvilket gør Java en løkke, der er nem at følge 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"); } }
Kompilér og kør klassen fra projektroden. Fordi filen deklarerer package com.guru99, den skal sidde i en matchende com/guru99 mappe, eller runtime rapporterer en klasse-ikke-fundet-fejl. Ændring af værdien på inputArmstrongNumber linje er alt, hvad der skal til for at teste en anden 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
Det er nyttigt at kontrollere én værdi ad gangen tracing, men den samme logik skalerer til et helt interval ved ombrydningping den i en ydre løkke.
Java Program til at udskrive Armstrong-numre fra 0 til 999
Den anden version bevarer det samme indre while loop og tilføjer en for en løkke, der går langs banen. Bemærk at digitCubeSum nulstilles til 0 i starten af hvert gennemløb, hvilket er den detalje, som de fleste begyndere glemmer.
//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
Opstillingen stopper ved 1 i stedet for at fortsætte til 9, fordi terningen af et enkelt ciffer kun matcher selve cifferet for 0 og 1. Hvis man i stedet opløfter hvert ciffer til potensen af cifferantallet, returneres alle ti encifrede værdier, hvilket er den samme generalisering, der er beskrevet tidligere.
Begge lister er korte nok til at kunne bruges som benchmark, så omkostningerne ved tilgangen er værd at angive eksplicit.
Tids- og rumkompleksiteten af Armstrong-talprogrammet
Den indre løkke dividerer arbejdsvariablen med 10 ved hver gennemgang, så den kører én gang pr. ciffer i stedet for én gang pr. enhed af tallet. Det gør enkeltværdikontrollen ekstremt billig, og den forbliver billig, efterhånden som inputtet vokser.
| Program | Tidskompleksitet | Rumkompleksitet |
| Tjek ét tal | O(d), hvor d er antallet af cifre | O (1) |
| Scan et interval af N tal | O(N × d) | O (1) |
Fordi d er lig med logaritmen10(tal) rundet opad, er den enkelte kontrol effektivt logaritmisk i den værdi, der testes. Kun tre int variabler allokeres nogensinde, og der oprettes intet array eller samling, hvilket er grunden til, at pladsomkostningerne forbliver konstante, uanset hvor stort intervallet bliver.
To praktiske bemærkninger følger af dette. For det første er afstandsscanningen domineret af N, så det koster cirka tusind gange mere at printe Armstrong-tal op til en million end at printe dem op til tusind. For det andet, en int løber over 2,147,483,647, så en søgning på tværs af meget store intervaller kræver long for både kandidaten og den løbende sum. Det samme ciffer - f.eks.tractionsmønsteret optræder i mange begynderøvelser, herunder primtalkontrol, Fibonacci-serien program- og arrayøvelser såsom boble sortering og indsætnings sortering.
