Armstrong szám a JAVA programban a For Loop használatával
⚡ Okos összefoglaló
Az Armstrong-számok egyenlőek a saját számjegyeik összegével, amelyet a számjegyek számának hatványára növesztünk, és a kettővel. Java Az alábbi programok egyetlen értéket ellenőriznek, és felsorolják az ezer alatti Armstrong-számokat.
Mi az Armstrong-szám?
Egy Armstrong-számban az egyes számjegyek erejének összege megegyezik magával a számmal.
Más szavakkal, a következő egyenlet igaz lesz
xy..z = xn + yn+.....+ zn
n a számjegyek száma a számban
Például ez egy 3 jegyű Armstrong-szám
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Példák Armstrongra Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Minden 0-tól 9-ig terjedő egyjegyű érték triviálisan kielégíti a szabályt, mivel az egyjegyű szám egyes hatványra emelve önmagát adja vissza. A háromjegyű Armstrong-számok teljes halmaza 153, 370, 371 és 407, míg az 1634, 8208 és 9474 a négyjegyű tagjai. A matematikusok ezeket az értékeket nárcisztikus számoknak is nevezik, mivel mindegyik a saját számjegyeiből reprodukálja önmagát.
Ezt írjuk egy programba:
Hogyan működik az Armstrong-számítási algoritmus?
A kód olvasása előtt érdemes látni a mindkét programban ismétlődő számtani műveleteket. Az ellenőrzéshez mindössze három műveletre van szükség: az utolsó számjegy eltávolítása, a kívánt hatványra emelése, és a szám eggyel való lerövidítése.
- Másolja a bemenetet egy működőképes fájlba változó így az eredeti érték megmarad a végső összehasonlításban.
- Vegyük az utolsó számjegyet a modulo operátorral,
digit = tempNumber % 10. - Emeld a számjegyet a darabszám hatványára, és add hozzá egy folyó összeghez.
- Egész osztással el kell hagyni az utolsó számjegyet,
tempNumber /= 10. - Ismételd addig, amíg a munkaváltozó értéke el nem éri a 0-t, majd hasonlítsd össze a futó összeget az eredeti számmal.
A lépések 153-on keresztüli futtatása a következő eredményt adja: trace alább. Az első program kinyomtatja a táblázat minden értékét, így a kimenet sorról sorra illeszthető a ciklus tanulásakor.
| Átmegy | ideiglenes szám | számjegy | számjegyKockaÖsszeg |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Kilépés | 0 | - | A 153 egyenlő 153-mal, tehát a 153 egy Armstrong-szám. |
Egy fontos korlátozás. Mindkét program háromszorozza meg a számjegyet önmagával, ami csak a helyes hatvány, miközben a bemenet pontosan három számjegyet tartalmaz. Az általános szabály szerint minden számjegyet az n-edik hatványra emelünk, ahol n a számjegyek darabszáma, tehát egy négyjegyű értékhez, például a 8208-hoz, egy negyedik hatványra kell emelni, amit a kocka alapú kód nem venne észre. Az, hogy először a számjegyeket számoljuk meg, majd mindegyiket erre a hatványra emeljük, teszi a rutint általános tesztté.
Miután a számtani műveletet törölte, az első program egyetlen fixen kódolt értékre alkalmazza azt.
Java Program annak ellenőrzésére, hogy egy szám Armstrong-szám-e
Az alábbi osztály a jelöltet a következőben tárolja: inputArmstrongNumber és minden menetben kinyomtatja a működő változókat, ami a Java könnyen követhető ciklus konzolon.
//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"); } }
Fordítsd le és futtasd az osztályt a projekt gyökeréből. Mivel a fájl deklarálja package com.guru99, egy illeszkedő com/guru99 mappában, vagy a futtatókörnyezet „osztály nem található” hibát jelez. Az érték módosítása a inputArmstrongNumber sor elég egy másik jelölt teszteléséhez.
teljesítmény
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
Egyszerre csak egy érték ellenőrzése hasznos, ha tracing, de ugyanaz a logika skálázható egy egész tartományra csomagolássalping egy külső ciklusban.
Java Program Armstrong-számok nyomtatására 0-tól 999-ig
A második változat megtartja az azonos belső while ciklus és hozzáad egy for ciklus, amely végigjárja a tartományt. Vegye figyelembe, hogy digitCubeSum minden menet elején 0-ra áll vissza, ami az a részlet, amit a legtöbb kezdő elfelejt.
//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"); } } }
teljesítmény
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
A felsorolás 1-nél megáll, ahelyett, hogy 9-ig folytatódna, mivel egy egyjegyű számjegy köbe csak 0 és 1 esetén egyezik meg magával a számjeggyel. Ha ehelyett minden számjegyet a számjegyek számának hatványára emelnénk, akkor mind a tíz egyjegyű értéket visszaadnánk, ami ugyanaz az általánosítás, mint amit korábban leírtunk.
Mindkét lista elég rövid az összehasonlításhoz, ezért érdemes a megközelítés költségét kifejezetten feltüntetni.
Az Armstrong-számprogram időbeli és térbeli komplexitása
A belső ciklus minden menetben 10-zel osztja a munkaváltozót, így számjegyenként egyszer fut le, nem pedig a szám egységenként. Ez rendkívül olcsóvá teszi az egyértékű ellenőrzést, és olcsó is marad a bemenet növekedésével.
| Program | Az idő összetettsége | A tér összetettsége |
| Jelölj be egy számot | O(d), ahol d a számjegyek száma | O (1) |
| N számból álló tartomány beolvasása | O(N × d) | O (1) |
Mivel d egyenlő logaritmikus értékkel10(szám) felfelé kerekítve, az egyetlen ellenőrzés gyakorlatilag logaritmikus a tesztelt értékben. Csak három int A változók mindig lefoglalásra kerülnek, és nem jön létre tömb vagy gyűjtemény, ezért a területköltség állandó marad, függetlenül attól, hogy milyen nagy lesz a tartomány.
Ebből két gyakorlati megjegyzés következik. Először is, a tartományletapogatást N uralja, így az Armstrong-számok nyomtatása egymillióig nagyjából ezerszer többe kerül, mint ezerig. Másodszor, egy int túlcsordul 2 147 483 647 felett, így nagyon nagy tartományokon belüli kereséshez szükség van long mind a jelölt, mind a folyó összeg esetében. Ugyanaz a számjegy-extracciós minta sok kezdő gyakorlatban megjelenik, beleértve a prímszám-ellenőrzés, a Fibonacci sorozat program- és tömbgyakorlatok, például buborékfajta és a beszúrási rendezés.
