Liczba Armstronga w programie JAVA z użyciem pętli For
⚡ Inteligentne podsumowanie
Liczby Armstronga są równe sumie ich własnych cyfr podniesionych do potęgi odpowiadającej liczbie cyfr, a te dwie Java Poniższe programy sprawdzają pojedynczą wartość i wypisują każdą liczbę Armstronga poniżej tysiąca.

Czym jest liczba Armstronga?
W liczbie Armstronga suma potęg poszczególnych cyfr jest równa samej liczbie.
Innymi słowy, poniższe równanie będzie prawdziwe
xy..z = xn + yn+.....+ zn
n to liczba cyfr w liczbie
Na przykład jest to 3-cyfrowy numer Armstronga
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Przykłady Armstronga Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Każda wartość jednocyfrowa od 0 do 9 spełnia tę regułę trywialnie, ponieważ liczba jednocyfrowa podniesiona do potęgi 1 zwraca samą siebie. Pełny zbiór trzycyfrowych liczb Armstronga to 153, 370, 371 i 407, a 1634, 8208 i 9474 to elementy czterocyfrowe. Matematycy nazywają te wartości również liczbami narcystycznymi, ponieważ każda z nich reprodukuje się z własnych cyfr.
Napiszmy to w programie:
Jak działa algorytm liczb Armstronga
Przed przeczytaniem kodu warto przyjrzeć się arytmetyce powtarzanej przez oba programy. Sprawdzenie wymaga tylko trzech operacji: usunięcia ostatniej cyfry, podniesienia jej do odpowiedniej potęgi i skrócenia liczby o jedno miejsce.
- Skopiuj dane wejściowe do działającego pliku zmienna więc oryginalna wartość przetrwa do ostatecznego porównania.
- Weź ostatnią cyfrę z operatorem modulo,
digit = tempNumber % 10. - Podnieś tę cyfrę do potęgi równej liczbie cyfr i dodaj ją do sumy bieżącej.
- Usuń ostatnią cyfrę przy dzieleniu całkowitym,
tempNumber /= 10. - Powtarzaj, aż zmienna robocza osiągnie 0, a następnie porównaj sumę bieżącą z liczbą pierwotną.
Wykonanie tych kroków w ciągu 153 powoduje trace poniżej. Każda wartość w tabeli jest drukowana przez pierwszy program, dzięki czemu dane wyjściowe można dopasowywać wiersz po wierszu podczas nauki pętli.
| Przechodzić | Numer temp. | cyfra | cyfraSuma sześcianu |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Wyjście | 0 | - | 153 równa się 153, więc 153 jest liczbą Armstronga |
Jedno ważne ograniczenie. Oba programy mnożą cyfrę przez siebie trzy razy, co jest poprawną potęgą tylko wtedy, gdy dane wejściowe mają dokładnie trzy cyfry. Zasada ogólna podnosi każdą cyfrę do potęgi n, gdzie n to liczba cyfr, więc czterocyfrowa wartość, taka jak 8208, wymaga czwartej potęgi i zostałaby pominięta przez kod oparty na kodzie sześciennym. Liczenie cyfr najpierw i podnoszenie każdej z nich do tej potęgi sprawia, że procedura staje się testem ogólnym.
Po uzyskaniu odpowiedzi na równanie pierwszy program stosuje ją do pojedynczej, zakodowanej na stałe wartości.
Java Program sprawdzający czy liczba jest liczbą Armstronga
Poniższa klasa przechowuje kandydata w inputArmstrongNumber i drukuje zmienne robocze przy każdym przejściu, co sprawia, że Java pętla łatwa do śledzenia w konsoli.
//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"); } }
Skompiluj i uruchom klasę z katalogu głównego projektu. Ponieważ plik deklaruje package com.guru99, musi znajdować się w pasującym miejscu com/guru99 folderu lub środowisko wykonawcze zgłasza błąd „klasa nie znaleziona”. Zmiana wartości w inputArmstrongNumber linia to wszystko, czego potrzeba do przetestowania innego kandydata.
Wydajność
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
Sprawdzanie jednej wartości na raz jest przydatne tracing, ale ta sama logika skaluje się do całego zakresu poprzez zawijanieping w pętli zewnętrznej.
Java Program do drukowania liczb Armstronga od 0 do 999
Druga wersja zachowuje identyczny wygląd wnętrza while pętla i dodaje for pętla, która porusza się po zakresie. Należy pamiętać, że digitCubeSum jest resetowany do 0 na początku każdego przejścia, co jest szczegółem, o którym większość początkujących zapomina.
//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"); } } }
Wydajność
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
Lista kończy się na 1 zamiast kontynuować do 9, ponieważ sześcian pojedynczej cyfry pasuje tylko do samej cyfry dla 0 i 1. Podniesienie każdej cyfry do potęgi równej liczbie cyfr zwróciłoby wszystkie dziesięć wartości jednocyfrowych, co jest tym samym uogólnieniem, które opisano wcześniej.
Oba zestawienia są na tyle krótkie, że można je porównać, więc warto wyraźnie określić koszt takiego podejścia.
Złożoność czasowa i przestrzenna programu liczb Armstronga
Pętla wewnętrzna dzieli zmienną roboczą przez 10 przy każdym przejściu, więc wykonuje się ją raz na każdą cyfrę, a nie raz na jednostkę liczby. Dzięki temu sprawdzanie pojedynczej wartości jest niezwykle tanie i pozostaje tanie wraz ze wzrostem danych wejściowych.
| Program | Złożoność czasowa | Złożoność przestrzeni |
| Zaznacz jedną liczbę | O(d), gdzie d to liczba cyfr | O (1) |
| Przeskanuj zakres N liczb | O(N × d) | O (1) |
Ponieważ d równa się log10(liczba) zaokrąglona w górę, pojedyncza kontrola jest w zasadzie logarytmiczna w testowanej wartości. Tylko trzy int zmienne są przydzielane na bieżąco i nie jest tworzona żadna tablica ani kolekcja, dlatego koszt przestrzeni pozostaje stały bez względu na to, jak duży jest zakres.
Z tego wynikają dwie praktyczne uwagi. Po pierwsze, skanowanie zakresu jest zdominowane przez N, więc wydrukowanie liczb Armstronga do miliona kosztuje około tysiąc razy więcej niż wydrukowanie ich do tysiąca. Po drugie, int przepełnienia powyżej 2 147 483 647, więc konieczne jest przeszukanie bardzo dużych zakresów long zarówno dla kandydata, jak i sumy bieżącej. Ta sama cyfra – np.tracwzór ten pojawia się w wielu ćwiczeniach dla początkujących, w tym sprawdzenie liczby pierwszejThe Seria Fibonacciego ćwiczenia programowe i tablicowe, takie jak sortowanie bąbelkowe oraz sortowanie przez wstawianie.
