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.

  • 🔘 Definicja: W przypadku liczby n-cyfrowej każdą cyfrę podnosimy do potęgi n, a następnie wyniki sumujemy.
  • ️ Przykład rozwiązania: Liczba 370 spełnia kryteria, ponieważ 3³ plus 7³ plus 0³ daje dokładnie 370.
  • ✅ Digit Extraccja: Operator modulo usuwa ostatnią cyfrę, a dzielenie całkowite skraca liczbę przy każdym przejściu.
  • 🧪 Dwa programy: Jeden testuje zakodowaną na stałe wartość 153, drugi natomiast przechodzi przez każdą liczbę od 0 do 999.
  • 🛠️. Znany limit: Podnoszenie każdej cyfry do sześcianu działa tylko w przypadku wartości trzycyfrowych, więc szersze zakresy wymagają potęgi n.
  • 📊 Złożoność: Oba programy działają w czasie O(d) na liczbę i wykorzystują dodatkową pamięć O(1).

Liczba Armstronga w Java program wykorzystujący pętlę for

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.

  1. Skopiuj dane wejściowe do działającego pliku zmienna więc oryginalna wartość przetrwa do ostatecznego porównania.
  2. Weź ostatnią cyfrę z operatorem modulo, digit = tempNumber % 10.
  3. Podnieś tę cyfrę do potęgi równej liczbie cyfr i dodaj ją do sumy bieżącej.
  4. Usuń ostatnią cyfrę przy dzieleniu całkowitym, tempNumber /= 10.
  5. 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.

FAQ

Tak. Podniesienie każdej cyfry do sześcianu daje 27 plus 343 plus 1, co daje 371, więc wartość się powtarza. Powyższy program wyświetla ją obok 153, 370 i 407.

Nazwa odzwierciedla samą właściwość: liczba składa się w całości z własnych cyfr, więc zdaje się podziwiać swoje odbicie. Oba terminy opisują tę samą regułę, a suma potęgowa cyfr jest czasami nazywana niezmiennikiem cyfrowym pluperfektnym.

Są trzy: 1634, 8208 i 9474. Każda cyfra jest podnoszona do czwartej potęgi, ponieważ wartość ma cztery cyfry. Kod oparty na kostce nie jest w stanie ich wykryć, dlatego wykładnik musi następować po liczbie cyfr.

Liczba doskonała jest równa sumie swoich właściwych dzielników, więc 6 spełnia warunek 1 plus 2 plus 3. Liczba Armstronga jest równa sumie potęg swoich cyfr. Te dwie definicje nie mają ze sobą wspólnego elementu arytmetycznego i rzadko się pokrywają.

Math.pow() zwraca wartość typu double, więc wymagane jest rzutowanie z powrotem na int, co może prowadzić do błędów zaokrąglania. W przypadku stałej kostki, cyfra*cyfra*cyfra jest szybsze i dokładniejsze. Math.pow() zyskuje swoją pozycję tylko wtedy, gdy wykładnik zmienia się wraz z liczbą cyfr.

Tak. Metoda pomocnicza może przyjąć wartość roboczą, dodać ostatnią cyfrę potęgi do akumulatora i wywołać samą siebie z liczbą podzieloną przez 10. Czyta się to dobrze, choć wersja pętli unika dodatkowych ramek stosu.

Współcześni asystenci potrafią wykonać manewr omijania trace, przeformułuj pętlę prostym językiem i zasugeruj przypadki skrajne, takie jak 0 lub ujemne dane wejściowe. Sprawdź trace w porównaniu z rzeczywistym wyjściem konsoli, ponieważ generowane przejścia czasami pomijają iterację.

Drugi pilot GitHub Zwykle kończy pętlę samą nazwą metody, ale często koduje kostkę na stałe. Wpisz wymaganą liczbę cyfr w wierszu poleceń, a następnie skompiluj i przetestuj sugestię, zanim jej zaufasz.

Podsumuj ten post następująco: