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.

  • 🔘 Meghatározás: Egy n jegyű szám esetén minden számjegyet az n-edik hatványra emelünk, és az eredményeket összeadjuk.
  • ☑️ Működő példa: A 370 azért felel meg a kritériumoknak, mert a 3³ plusz a 7³ plusz a 0³ összeadása pontosan 370-et ad vissza.
  • DigiExtracmegad: A modulo operátor lehántja az utolsó számjegyet, és az egész számokkal való osztás minden menetben rövidíti a számot.
  • 🧪 Két program: Az egyik egy fixen kódolt 153-as értéket tesztel, a másik pedig végigmegy az összes számon 0-tól 999-ig.
  • 🇧🇷 Ismert határérték: Minden számjegy köbre emelése csak háromjegyű értékek esetén működik, így a szélesebb tartományokhoz n hatványára van szükség.
  • 📊 Bonyolultság: Mindkét program O(d) időt vesz igénybe számonként, és O(1) extra memóriát használ.

Armstrong-szám Java programozás for ciklus használatával

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.

  1. 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.
  2. Vegyük az utolsó számjegyet a modulo operátorral, digit = tempNumber % 10.
  3. Emeld a számjegyet a darabszám hatványára, és add hozzá egy folyó összeghez.
  4. Egész osztással el kell hagyni az utolsó számjegyet, tempNumber /= 10.
  5. 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.

GYIK

Igen. Minden számjegyet köbre ejtünk, így 27-et adunk hozzá, plusz 343-at, plusz 1-et, ami összesen 371, tehát az érték reprodukálja önmagát. A fenti range program kinyomtatja a 153, 370 és 407 mellett.

A név magát a tulajdonságot tükrözi: a szám teljes egészében a saját számjegyeiből épül fel, így úgy tűnik, mintha a saját tükörképét csodálná. Mindkét kifejezés ugyanazt a szabályt írja le, és a számjegy-hatványösszeget néha plusquamperfekt digitális invariánsnak nevezik.

Három van: 1634, 8208 és 9474. Minden számjegyet a negyedik hatványra emelünk, mivel az érték négyjegyű. A kocka alapú kód nem tudja ezeket felismerni, ezért a kitevőnek a számjegyek számlálását kell követnie.

Egy tökéletes szám egyenlő a valódi osztóinak összegével, tehát a 6 az 1 plusz 2 plusz 3-ig terjed. Egy Armstrong-szám egyenlő a számjegyhatványainak összegével. A két definíciónak nincs aritmetikai közös eleme, és ritkán fedik át egymást.

A Math.pow() dupla értéket ad vissza, így az egész számra való visszaalakítás szükséges, és kerekítési hibák lehetségesek. Fix kocka esetén a digit*digit*digit gyorsabb és pontosabb. A Math.pow() csak akkor nyeri el a helyét, ha a kitevő a számjegyek számával változik.

Igen. Egy segítő metódus veheti a működő értéket, hozzáadhatja a hatványozott utolsó számjegyet egy akkumulátorhoz, és a kapott szám 10-zel osztva hívhatja meg magát. Jól olvasható, bár a ciklusos verzió elkerüli az extra veremkereteket.

A modern asszisztensek képesek egy elhaladó hangot előállítani trace, fogalmazd meg újra a ciklust egyszerű nyelven, és javasolj szélső eseteket, például 0-t vagy negatív bemenetet. Ellenőrizd a trace a valódi konzolkimenettel szemben, mivel a generált bemutatók időnként kihagynak egy iterációt.

GitHub másodpilóta általában pusztán a metódus nevéből befejezi a ciklust, de gyakran fixen kódolja a kockát. Add meg a számjegyek számának követelményét a promptban, majd fordítsd le és teszteld a javaslatot, mielőtt megbízol benne.

Foglald össze ezt a bejegyzést a következőképpen: