Armstrongovo číslo v programu JAVA pomocí pro smyčku

⚡ Chytré shrnutí

Armstrongova čísla se rovnají součtu jejich vlastních číslic umocněnému na počet číslic a obou Java Níže uvedené programy kontrolují jednu hodnotu a vypisují všechna Armstrongova čísla pod tisíc.

  • 🔘 Definice: U n-ciferného čísla se každá číslice umocní na n-tou a výsledky se sečtou.
  • ☑️ Zpracovaný příklad: 370 je možné, protože 3³ plus 7³ plus 0³ vrací přesně 370.
  • (Tj. Digit Extracakce: Operátor modulo odlupuje poslední číslici a celočíselné dělení v každém průchodu číslo zkracuje.
  • 🧪 Dva programy: Jeden testuje pevně zakódovanou hodnotu 153, druhý prochází všechna čísla od 0 do 999.
  • 🛠️ Známý limit: Krychle každé číslice funguje pouze pro trojciferné hodnoty, takže širší rozsahy vyžadují mocninu n.
  • 📊 Složitost: Oba programy běží na číslo v čase O(d) a spotřebují O(1) dodatečné paměti.

Armstrongovo číslo v Java program s použitím cyklu for

Co je Armstrongovo číslo?

V Armstrongově čísle se součet mocnin jednotlivých číslic rovná samotnému číslu.

Jinými slovy bude platit následující rovnice

xy..z = xn + yn+.....+ zn

n je počet číslic v čísle

Například toto je 3místné Armstrongovo číslo

370 = 33 + 73 + 03
 = 27 + 343 + 0
 = 370

Příklady Armstronga Numbers

0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.

Každé jednociferné číslo od 0 do 9 splňuje pravidlo triviálně, protože jednociferné číslo umocněné na jedničku vrací samo sebe. Úplná sada trojciferných Armstrongových čísel je 153, 370, 371 a 407, zatímco 1634, 8208 a 9474 jsou čtyřciferné členy. Matematici tyto hodnoty také nazývají narcistická čísla, protože každé z nich se reprodukuje ze svých vlastních číslic.

Napíšeme to v programu:

Jak funguje algoritmus Armstrongova čísla

Než si přečtete kód, je dobré si uvědomit aritmetické operace, které oba programy opakují. Kontrola vyžaduje pouze tři operace: oddělit poslední číslici, umocnit ji na požadovanou hodnotu a zkrátit číslo o jedno místo.

  1. Zkopírujte vstup do funkčního proměnlivý takže původní hodnota přežije pro konečné porovnání.
  2. Vezměte poslední číslici s operátorem modulo, digit = tempNumber % 10.
  3. Umocněte tuto číslici na počet číslic a přičtěte ji k průběžnému součtu.
  4. Při celočíselném dělení odstraňte poslední číslici, tempNumber /= 10.
  5. Opakujte, dokud pracovní proměnná nedosáhne 0, a poté porovnejte průběžný součet s původním číslem.

Spuštěním těchto kroků přes 153 se získá tracníže. Každou hodnotu v tabulce vytiskne první program, takže výstup lze během učení smyčky porovnávat řádek po řádku.

Přejít dočasné číslo číslice digitCubeSum
1 153 3 27
2 15 5 152
3 1 1 153
Výstup 0 - 153 se rovná 153, takže 153 je Armstrongovo číslo

Jedno důležité omezení. Oba programy vynásobí číslici samou sebou třikrát, což je správná mocnina pouze tehdy, pokud má vstup přesně tři číslice. Obecné pravidlo umocňuje každou číslici na n, kde n je počet číslic, takže čtyřciferná hodnota, jako například 8208, potřebuje čtvrtou mocninu a kód založený na krychlích by ji přehlédl. Spočítání číslic a následné umocnění každé číslice na tuto mocninu promění rutinu v obecný test.

Po vymazání aritmetických operací první program aplikuje tyto operace na jednu pevně zakódovanou hodnotu.

Java Program pro kontrolu, zda je číslo Armstrongovo číslo

Níže uvedená třída ukládá kandidáta do inputArmstrongNumber a při každém průchodu vytiskne pracovní proměnné, což dělá Java smyčka, kterou lze snadno sledovat v 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");
	}
}

Zkompilujte a spusťte třídu z kořenového adresáře projektu. Protože soubor deklaruje package com.guru99, musí sedět v odpovídajícím com/guru99 složku nebo běhové prostředí hlásí chybu „třída nenalezena“. Změna hodnoty ve inputArmstrongNumber linka je vše, co je potřeba k otestování jiného kandidáta.

Výstup

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

Kontrola jedné hodnoty najednou je užitečná pro tracing, ale stejná logika se škáluje na celý rozsah pomocí zalamováníping to ve vnější smyčce.

Java Program pro tisk Armstrongových čísel od 0 do 999

Druhá verze si zachovává identický vnitřní prostor. while smyčka a přidá for smyčka, která prochází rozsahem. Všimněte si, že digitCubeSum se na začátku každého průchodu vynuluje na 0, což je detail, na který většina začátečníků zapomíná.

//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");
        }
    }
}

Výstup

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

Výpis se zastaví na čísle 1, místo aby pokračoval až k číslu 9, protože třetí mocnina jedné číslice odpovídá samotné číslici pouze pro 0 a 1. Umocnění každé číslice na počet číslic by vrátilo všech deset jednociferných hodnot, což je stejné zobecnění, jaké bylo popsáno dříve.

Oba seznamy jsou dostatečně krátké na to, aby se daly srovnávat, takže je vhodné explicitně uvést náklady na daný přístup.

Časová a prostorová složitost Armstrongova číselného programu

Vnitřní smyčka dělí pracovní proměnnou číslem 10 při každém průchodu, takže se provede jednou za každou číslici, nikoli jednou za každou jednotku čísla. Díky tomu je kontrola jedné hodnoty extrémně levná a zůstává levná i s rostoucím vstupem.

Program Časová složitost Prostorová složitost
Zaškrtněte jedno číslo O(d), kde d je počet číslic O (1)
Naskenujte rozsah N čísel O(N × d) O (1)

Protože d se rovná logaritmu10(číslo) zaokrouhleno nahoru, je jednotlivá kontrola efektivně logaritmická v testované hodnotě. Pouze tři int Proměnné se nikdy alokují a nevytváří se žádné pole ani kolekce, proto náklady na prostor zůstávají konstantní bez ohledu na to, jak velký je rozsah.

Z toho vyplývají dvě praktické poznámky. Zaprvé, skenování rozsahu je dominantně ovlivněno N, takže tisk Armstrongových čísel do milionu stojí zhruba tisíckrát více než tisk do tisíce. Zadruhé, int přetéká nad 2 147 483 647, takže vyhledávání ve velmi velkých rozsazích vyžaduje long pro kandidáta i průběžný součet. Stejná číslice - např.tracVzorec působení se objevuje v mnoha cvicích pro začátečníky, včetně kontrola prvočíslase Fibonacciho řada programové a array cvičení, jako například bublinové řazení a řazení řazení.

Nejčastější dotazy

Ano. Umocnění každé číslice na třetí místo dá součet 27 plus 343 plus 1, což je 371, takže hodnota se sama reprodukuje. Program pro práci s rozsahy výše ji vypíše spolu s 153, 370 a 407.

Název odráží samotnou vlastnost: číslo je složeno výhradně z vlastních číslic, takže se zdá, jako by obdivovalo svůj vlastní odraz. Oba termíny popisují stejné pravidlo a součet číslic a mocnin se někdy nazývá plusperfektní digitální invariant.

Existují tři čísla: 1634, 8208 a 9474. Každá číslice se umocňuje na čtvrtou, protože hodnota má čtyři číslice. Kód založený na krychli je nedokáže detekovat, a proto musí exponent následovat za počtem číslic.

Dokonalé číslo se rovná součtu svých vlastních dělitelů, takže 6 se kvalifikuje až do 1 plus 2 plus 3. Armstrongovo číslo se rovná součtu svých ciferných mocnin. Tyto dvě definice nemají společné aritmetické funkce a zřídka se překrývají.

Math.pow() vrací hodnotu typu double, takže je nutné přetypování zpět na int a jsou možné chyby zaokrouhlování. Pro pevnou krychli je digit*digit*digit rychlejší a přesnější. Math.pow() si zaslouží své místo pouze tehdy, když se exponent mění s počtem číslic.

Ano. Pomocná metoda může vzít pracovní hodnotu, přičíst poslední číslici s funkcí `power` k akumulátoru a zavolat se s číslem děleným 10. Čte se dobře, i když verze s cyklem se vyhýbá dalším zásobníkovým rámcům.

Moderní asistenti mohou vytvořit průchod-by-pass trace. přeformulujte smyčku v jednoduchém jazyce a navrhněte okrajové případy, jako je 0 nebo záporný vstup. Ověřte trace oproti skutečnému výstupu z konzole, protože vygenerované návody občas přeskakují iteraci.

GitHub Copilot obvykle dokončí smyčku pouze na základě názvu metody, ale často napevno zakóduje krychli. Uveďte požadavek na počet číslic v promptu a poté návrh zkompilujte a otestujte, než mu budete důvěřovat.

Shrňte tento příspěvek takto: