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.

  • 🔘 Definiție: Pentru un număr de n cifre, fiecare cifră este ridicată la puterea n, iar rezultatele se adună.
  • ☑️ Exemplu lucrat: 370 se califică deoarece 3³ plus 7³ plus 0³ returnează exact 370.
  • Digit ExtracTION: Operatorul modulo elimină ultima cifră, iar împărțirea întreagă scurtează numărul la fiecare trecere.
  • 🧪 Două programe: Unul testează o valoare codificată hard de 153, celălalt parcurge fiecare număr de la 0 la 999.
  • 🛠️ Limită cunoscută: Cubarea fiecărei cifre funcționează doar pentru valori de trei cifre, deci intervale mai largi necesită puterea lui n.
  • 📊 Complexitate: Ambele programe rulează în timp de O(d) per număr și utilizează O(1) memorie suplimentară.

Numărul Armstrong în Java program folosind o buclă for

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.

  1. Copiați datele de intrare într-un fișier de lucru variabil deci valoarea inițială supraviețuiește pentru comparația finală.
  2. Luați ultima cifră cu operatorul modulo, digit = tempNumber % 10.
  3. Ridică acea cifră la puterea numărului de cifre și adun-o la un total continuu.
  4. Eliminați ultima cifră prin împărțirea pe întreg, tempNumber /= 10.
  5. 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.

Întrebări frecvente

Da. Înălțarea fiecărei cifre la cub dă 27 plus 343 plus 1, ceea ce duce la 371, deci valoarea se reproduce singură. Programul de interval de mai sus o afișează alături de 153, 370 și 407.

Numele reflectă proprietatea în sine: numărul este construit în întregime din propriile cifre, așa că pare să-și admire propria reflexie. Ambii termeni descriu aceeași regulă, iar suma puterilor cifrelor este uneori numită invariant digital mai mult decât perfect.

Există trei: 1634, 8208 și 9474. Fiecare cifră este ridicată la puterea a patra deoarece valoarea are patru cifre. Codul bazat pe cub nu le poate detecta, motiv pentru care exponentul trebuie să urmeze numărătoarea cifrelor.

Un număr perfect este egal cu suma divizorilor săi proprii, deci 6 se califică prin 1 plus 2 plus 3. Un număr Armstrong este egal cu suma puterilor cifrelor sale. Cele două definiții nu au în comun aritmetica și rareori se suprapun.

Math.pow() returnează un double, deci este necesară o conversie înapoi la int și devin posibile erori de rotunjire. Pentru un cub fix, digit*digit*digit este mai rapidă și exactă. Math.pow() își câștigă locul numai atunci când exponentul variază în funcție de numărul de cifre.

Da. O metodă auxiliară poate lua valoarea de lucru, poate adăuga ultima cifră la un acumulator și se poate apela singură cu numărul împărțit la 10. Se citește bine, deși versiunea cu buclă evită cadrele suplimentare din stivă.

Asistenții moderni pot produce o listă de trecere-de-trecere trace. reformulați bucla în limbaj simplu și sugerați cazuri limită, cum ar fi 0 sau o intrare negativă. Verificați trace împotriva ieșirii reale a consolei, deoarece soluțiile generate sar ocazional peste o iterație.

Copilotul GitHub de obicei completează bucla doar pornind de la numele metodei, dar adesea codifică cubul. Indicați cerința privind numărul de cifre în prompt, apoi compilați și testați sugestia înainte de a o considera încrezătoare.

Rezumați această postare cu: