Armstrongov broj u JAVA programu pomoću petlje For
⚡ Pametni sažetak
Armstrongovi brojevi jednaki su zbroju vlastitih znamenki podignutih na potenciju broja znamenki, a te dvije Java Programi u nastavku provjeravaju jednu vrijednost i navode svaki Armstrongov broj ispod tisuću.
Što je Armstrongov broj?
U Armstrongovom broju, zbroj snaga pojedinačnih znamenki jednak je samom broju.
Drugim riječima, vrijedit će sljedeća jednadžba
xy..z = xn + yn+.....+ zn
n je broj znamenki u broju
Na primjer, ovo je troznamenkasti Armstrongov broj
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Primjeri Armstronga Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Svaka jednoznamenkasta vrijednost od 0 do 9 trivijalno zadovoljava pravilo, jer jednoznamenkasti broj podignut na potenciju jedan vraća samog sebe. Potpuni skup troznamenkastih Armstrongovih brojeva je 153, 370, 371 i 407, dok su 1634, 8208 i 9474 četveroznamenkasti članovi. Matematičari ove vrijednosti nazivaju i narcističkim brojevima, budući da se svaki reproducira iz vlastitih znamenki.
Zapišimo ovo u programu:
Kako funkcionira Armstrongov algoritam brojeva
Prije čitanja koda, korisno je vidjeti aritmetiku koju oba programa ponavljaju. Provjera zahtijeva samo tri operacije: odvojiti posljednju znamenku, podići je na potrebnu potenciju i skratiti broj za jedno mjesto.
- Kopiraj ulaz u radni varijabla tako da originalna vrijednost preživljava za konačnu usporedbu.
- Uzmite posljednju znamenku s operatorom modulo,
digit = tempNumber % 10. - Podignite tu znamenku na potenciju broja znamenki i dodajte je tekućem zbroju.
- Izbacite posljednju znamenku kod cjelobrojnog dijeljenja,
tempNumber /= 10. - Ponavljajte postupak dok radna varijabla ne dosegne 0, a zatim usporedite tekući zbroj s izvornim brojem.
Izvođenje tih koraka preko 153 daje trace dolje. Svaku vrijednost u tablici ispisuje prvi program, tako da se izlaz može uspoređivati redak po redak tijekom učenja petlje.
| Proći | privremeni broj | cifra | digitCubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Exit | 0 | - | 153 je jednako 153, pa je 153 Armstrongov broj |
Jedno važno ograničenje. Oba programa množe znamenku sa samom sobom tri puta, što je ispravna potencija samo dok ulaz ima točno tri znamenke. Opće pravilo podiže svaku znamenku na potenciju n, gdje je n broj znamenki, pa četveroznamenkasta vrijednost poput 8208 treba četvrtu potenciju i kod temeljen na kocki bi je propustio. Brojanje znamenki prvo i podizanje svake na tu potenciju pretvara rutinu u opći test.
Nakon što je aritmetika raščišćena, prvi program je primjenjuje na jednu čvrsto kodiranu vrijednost.
Java Program za provjeru je li broj Armstrongov broj
Klasa ispod pohranjuje kandidata u inputArmstrongNumber i ispisuje radne varijable u svakom prolazu, što čini Java petlja koju je lako pratiti u konzoli.
//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"); } }
Kompajlirajte i pokrenite klasu iz korijena projekta. Budući da datoteka deklarira package com.guru99, mora se nalaziti u odgovarajućem com/guru99 mape ili okruženje za izvođenje prijavljuje grešku "klasa nije pronađena". Promjenom vrijednosti na inputArmstrongNumber linija je sve što je potrebno za testiranje drugog kandidata.
Izlaz
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
Provjeravanje jedne vrijednosti istovremeno je korisno za tracing, ali ista logika skalira na cijeli raspon prelamanjemping to u vanjskoj petlji.
Java Program za ispis Armstrongovih brojeva od 0 do 999
Druga verzija zadržava identičnu unutrašnjost while petlja i dodaje for petlja koja obilazi raspon. Imajte na umu da digitCubeSum se resetira na 0 na vrhu svakog prolaza, što je detalj koji većina početnika zaboravlja.
//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"); } } }
Izlaz
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
Popis se zaustavlja na 1 umjesto da se nastavi do 9 jer kub jedne znamenke odgovara samoj znamenki za 0 i 1. Podizanje svake znamenke na potenciju broja znamenki vratilo bi svih deset jednoznamenkastih vrijednosti, što je ista generalizacija opisana ranije.
Oba popisa su dovoljno kratka za usporedbu, tako da je vrijedno eksplicitno navesti trošak pristupa.
Vremenska i prostorna složenost Armstrongovog programa brojeva
Unutarnja petlja dijeli radnu varijablu s 10 u svakom prolazu, tako da se izvršava jednom po znamenki, a ne jednom po jedinici broja. To čini provjeru jedne vrijednosti izuzetno jeftinom i ostaje jeftina kako ulaz raste.
| program | Vremenska složenost | Složenost prostora |
| Označi jedan broj | O(d), gdje je d broj znamenki | O (1) |
| Skeniraj raspon od N brojeva | O(N × d) | O (1) |
Jer d je jednako logaritmu10(broj) zaokružen prema gore, pojedinačna provjera je zapravo logaritamska u vrijednosti koja se testira. Samo tri int Varijable se nikada ne dodjeljuju i ne stvara se niz ili kolekcija, zbog čega trošak prostora ostaje konstantan bez obzira na to koliko velik raspon postane.
Iz ovoga slijede dvije praktične napomene. Prvo, skeniranje raspona dominira N, pa ispis Armstrongovih brojeva do milijun košta otprilike tisuću puta više nego ispis do tisuću. Drugo, int prelijeva se iznad 2,147,483,647, pa je potrebno pretraživanje u vrlo velikim rasponima long i za kandidata i za tekući zbroj. Ista znamenka-npr.tracUzorak cije pojavljuje se u mnogim vježbama za početnike, uključujući i provjera prostih brojeva je Fibonaccijevi niz programske i nizovne vježbe kao što su sortiranje mjehurićima i umetanje sortirati.
