Numărul Armstrong în programul JAVA folosind bucla For
⚡ Rezumat inteligent
Numerele Armstrong sunt egale cu suma propriilor cifre ridicate la puterea numărului de cifre, iar cele două Java Programele de mai jos verifică o singură valoare și listează fiecare număr Armstrong sub o mie.
Ce este numărul Armstrong?
Într-un număr Armstrong, suma puterii cifrelor individuale este egală cu numărul însuși.
Cu alte cuvinte, următoarea ecuație va fi adevărată
xy..z = xn + yn+.....+ zn
n este numărul de cifre în număr
De exemplu, acesta este un număr Armstrong din 3 cifre
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Exemple de Armstrong Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Fiecare valoare cu o singură cifră de la 0 la 9 satisface regula în mod trivial, deoarece un număr cu o singură cifră ridicat la puterea unu se returnează pe sine. Mulțimea completă a numerelor Armstrong cu trei cifre este 153, 370, 371 și 407, în timp ce 1634, 8208 și 9474 sunt membrii cu patru cifre. Matematicienii numesc aceste valori și numere narcisiste, deoarece fiecare se reproduce din propriile cifre.
Să scriem asta într-un program:
Cum funcționează algoritmul numărului Armstrong
Înainte de a citi codul, este util să vedeți aritmetica pe care ambele programe o repetă. Verificarea necesită doar trei operații: îndepărtați ultima cifră, ridicați-o la puterea necesară și scurtați numărul cu o poziție.
- Copiați datele de intrare într-un fișier de lucru variabil deci valoarea inițială supraviețuiește pentru comparația finală.
- Luați ultima cifră cu operatorul modulo,
digit = tempNumber % 10. - Ridică acea cifră la puterea numărului de cifre și adun-o la un total continuu.
- Eliminați ultima cifră prin împărțirea pe întreg,
tempNumber /= 10. - Repetați până când variabila de lucru ajunge la 0, apoi comparați totalul curent cu numărul inițial.
Executarea acelor pași peste 153 produce trace mai jos. Fiecare valoare din tabel este afișată de primul program, astfel încât ieșirea poate fi corelată linie cu linie în timp ce se învață bucla.
| Trece | Număr temp. | cifră | cifreCubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Ieşire | 0 | - | 153 este egal cu 153, deci 153 este un număr Armstrong. |
O limitare importantă. Ambele programe înmulțesc cifra cu ea însăși de trei ori, ceea ce reprezintă puterea corectă doar atunci când intrarea are exact trei cifre. Regula generală ridică fiecare cifră la puterea n, unde n este numărul de cifre, deci o valoare de patru cifre, cum ar fi 8208, necesită o a patra putere și ar fi omisă de codul bazat pe cub. Numărarea mai întâi a cifrelor și ridicarea fiecăreia la acea putere este ceea ce transformă rutina într-un test general.
Cu aritmetica clară, primul program o aplică unei singure valori codificate hard.
Java Program pentru a verifica dacă un număr este Armstrong Number
Clasa de mai jos stochează candidatul în inputArmstrongNumber și imprimă variabilele de lucru la fiecare trecere, ceea ce face ca Java buclă ușor de urmărit într-o consolă.
//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"); } }
Compilează și rulează clasa din rădăcina proiectului. Deoarece fișierul declară package com.guru99, trebuie să se afle într-o poziție potrivită com/guru99 folder sau runtime-ul raportează o eroare class-not-found. Modificarea valorii din inputArmstrongNumber linie este tot ce este necesar pentru a testa un alt candidat.
producție
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
Verificarea unei valori pe rând este utilă pentru tracing, dar aceeași logică se scalează la un interval întreg prin încadrareping într-o buclă exterioară.
Java Program pentru a imprima numerele Armstrong de la 0 la 999
A doua versiune păstrează același interior while buclă și adaugă o for buclă care parcurge intervalul. Rețineți că digitCubeSum este resetat la 0 la începutul fiecărei treceri, acesta fiind detaliul pe care majoritatea începătorilor îl uită.
//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"); } } }
producție
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
Listarea se oprește la 1 în loc să continue până la 9, deoarece cubul unei singure cifre se potrivește cu cifra însăși doar pentru 0 și 1. Ridicarea fiecărei cifre la puterea numărului de cifre ar returna în schimb toate cele zece valori cu o singură cifră, ceea ce este aceeași generalizare descrisă anterior.
Ambele listări sunt suficient de scurte pentru a fi utilizate ca punct de referință, așa că merită menționat explicit costul abordării.
Complexitatea timpului și spațiului programului numerelor Armstrong
Bucla interioară împarte variabila de lucru la 10 la fiecare trecere, deci rulează o dată pe cifră, în loc de o dată pe unitate de număr. Acest lucru face ca verificarea cu o singură valoare să fie extrem de ieftină și să rămână ieftină pe măsură ce datele de intrare cresc.
| Program | Complexitatea timpului | Complexitatea spațială |
| Bifați un număr | O(d), unde d este numărul de cifre | O (1) |
| Scanează un interval de N numere | O(N × d) | O (1) |
Deoarece d este egal cu logaritmul10(număr) rotunjit, verificarea unică este efectiv logaritmică în valoarea testată. Doar trei int variabilele nu sunt alocate niciodată și nu se creează nicio matrice sau colecție, motiv pentru care costul spațiului rămâne constant indiferent de cât de mare devine intervalul.
Două observații practice decurg din aceasta. În primul rând, scanarea de distanțe este dominată de N, așadar imprimarea numerelor Armstrong până la un milion costă de aproximativ o mie de ori mai mult decât imprimarea lor până la o mie. În al doilea rând, o int depășește 2,147,483,647, deci este necesară o căutare în intervale foarte mari long atât pentru candidat, cât și pentru suma curentă. Aceeași cifră-extracModelul de țiune apare în multe exerciții pentru începători, inclusiv în verificarea numerelor prime, Seria Fibonacci exerciții de tip program și matrice, cum ar fi sortare cu bule și sortare inserție.
