Armstrong-nummer i JAVA-program, der bruger For Loop

⚡ Smart opsummering

Armstrong-tal er lig med summen af ​​deres egne cifre opløftet i potensen af ​​cifferantal, og de to Java Programmerne nedenfor kontrollerer en enkelt værdi og angiver alle Armstrong-tal under tusind.

  • 🔘 Definition: For et n-cifret tal opløftes hvert ciffer til potensen n, og resultaterne lægges sammen.
  • ☑️ Udarbejdet eksempel: 370 kvalificerer sig, fordi 3³ plus 7³ plus 0³ returnerer præcis 370.
  • Digit Ekstraction: Modulo-operatoren fjerner det sidste ciffer, og heltalsdivision forkorter tallet i hver gennemgang.
  • 🧪 To programmer: Den ene tester en hardkodet værdi på 153, den anden gennemgår alle tal fra 0 til 999.
  • 🛠️ Kendt grænse: At ophæve hvert ciffer i tredje potens fungerer kun for trecifrede værdier, så bredere intervaller kræver potensen n.
  • 📊 kompleksitet: Begge programmer kører i O(d) tid pr. tal og bruger O(1) ekstra hukommelse.

Armstrong-nummer i Java program ved hjælp af en for-løkke

Hvad er Armstrong nummer?

I et Armstrong-tal er summen af ​​potens af individuelle cifre lig med selve tallet.

Med andre ord vil den følgende ligning holde stik

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

n er antallet af cifre i antallet

Dette er for eksempel et 3-cifret Armstrong-nummer

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

Eksempler på Armstrong Numbers

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

Enhver encifret værdi fra 0 til 9 opfylder reglen trivielt, fordi et encifret tal opløftet i potensen én returnerer sig selv. Det komplette sæt af trecifrede Armstrong-tal er 153, 370, 371 og 407, mens 1634, 8208 og 9474 er de firecifrede medlemmer. Matematikere kalder også disse værdier for narcissistiske tal, da hvert tal reproducerer sig selv fra sine egne cifre.

Lad os skrive dette i et program:

Hvordan Armstrong-talalgoritmen fungerer

Før man læser koden, er det en god idé at se den regnemåde, som begge programmer gentager. Kontrollen kræver kun tre operationer: pil det sidste ciffer af, opløft det til den ønskede potens, og forkort tallet med én plads.

  1. Kopier inputtet til en fungerende variabel så den oprindelige værdi bevares til den endelige sammenligning.
  2. Tag det sidste ciffer med modulo-operatoren, digit = tempNumber % 10.
  3. Opløft det ciffer op i potensen af ​​cifferantallet og læg det til en løbende total.
  4. Fjern det sidste ciffer med heltalsdivision, tempNumber /= 10.
  5. Gentag indtil arbejdsvariablen når 0, og sammenlign derefter den løbende total med det oprindelige tal.

At køre disse trin over 153 producerer trace nedenfor. Hver værdi i tabellen udskrives af det første program, så outputtet kan matches linje for linje, mens løkken læres.

Pass tempNummer ciffer cifferKubeSum
1 153 3 27
2 15 5 152
3 1 1 153
Udgang 0 - 153 er lig med 153, så 153 er et Armstrong-tal

En vigtig begrænsning. Begge programmer ganger cifferet med sig selv tre gange, hvilket kun er den korrekte potens, når inputtet har præcis tre cifre. Den generelle regel opløfter hvert ciffer til potensen n, hvor n er antallet af cifre, så en firecifret værdi som 8208 kræver en fjerde potens og ville blive overset af terningbaseret kode. At tælle cifrene først og opløfte hvert ciffer til den potens er det, der gør rutinen til en generel test.

Når aritmetikken er klar, anvender det første program den på en enkelt hardkodet værdi.

Java Program til at kontrollere, om et nummer er Armstrong-nummer

Klassen nedenfor gemmer kandidaten i inputArmstrongNumber og udskriver arbejdsvariablerne ved hver gennemgang, hvilket gør Java en løkke, der er nem at følge i en konsol.

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

Kompilér og kør klassen fra projektroden. Fordi filen deklarerer package com.guru99, den skal sidde i en matchende com/guru99 mappe, eller runtime rapporterer en klasse-ikke-fundet-fejl. Ændring af værdien på inputArmstrongNumber linje er alt, hvad der skal til for at teste en anden kandidat.

Produktion

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

Det er nyttigt at kontrollere én værdi ad gangen tracing, men den samme logik skalerer til et helt interval ved ombrydningping den i en ydre løkke.

Java Program til at udskrive Armstrong-numre fra 0 til 999

Den anden version bevarer det samme indre while loop og tilføjer en for en løkke, der går langs banen. Bemærk at digitCubeSum nulstilles til 0 i starten af ​​hvert gennemløb, hvilket er den detalje, som de fleste begyndere glemmer.

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

Produktion

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

Opstillingen stopper ved 1 i stedet for at fortsætte til 9, fordi terningen af ​​et enkelt ciffer kun matcher selve cifferet for 0 og 1. Hvis man i stedet opløfter hvert ciffer til potensen af ​​cifferantallet, returneres alle ti encifrede værdier, hvilket er den samme generalisering, der er beskrevet tidligere.

Begge lister er korte nok til at kunne bruges som benchmark, så omkostningerne ved tilgangen er værd at angive eksplicit.

Tids- og rumkompleksiteten af ​​Armstrong-talprogrammet

Den indre løkke dividerer arbejdsvariablen med 10 ved hver gennemgang, så den kører én gang pr. ciffer i stedet for én gang pr. enhed af tallet. Det gør enkeltværdikontrollen ekstremt billig, og den forbliver billig, efterhånden som inputtet vokser.

Program Tidskompleksitet Rumkompleksitet
Tjek ét tal O(d), hvor d er antallet af cifre O (1)
Scan et interval af N tal O(N × d) O (1)

Fordi d er lig med logaritmen10(tal) rundet opad, er den enkelte kontrol effektivt logaritmisk i den værdi, der testes. Kun tre int variabler allokeres nogensinde, og der oprettes intet array eller samling, hvilket er grunden til, at pladsomkostningerne forbliver konstante, uanset hvor stort intervallet bliver.

To praktiske bemærkninger følger af dette. For det første er afstandsscanningen domineret af N, så det koster cirka tusind gange mere at printe Armstrong-tal op til en million end at printe dem op til tusind. For det andet, en int løber over 2,147,483,647, så en søgning på tværs af meget store intervaller kræver long for både kandidaten og den løbende sum. Det samme ciffer - f.eks.tractionsmønsteret optræder i mange begynderøvelser, herunder primtalkontrol, Fibonacci-serien program- og arrayøvelser såsom boble sortering og indsætnings sortering.

Ofte Stillede Spørgsmål

Ja. Hvis man opløfter hvert ciffer i tredje potens, får man 27 plus 343 plus 1, hvilket giver 371, så værdien reproducerer sig selv. Ovenstående intervalprogram udskriver den sammen med 153, 370 og 407.

Navnet afspejler selve egenskaben: tallet er bygget udelukkende af sine egne cifre, så det ser ud til at beundre sin egen spejling. Begge udtryk beskriver den samme regel, og ciffer-potenssummen kaldes undertiden en pluskvamperfektum digital invariant.

Der er tre: 1634, 8208 og 9474. Hvert ciffer opløftes i fjerde potens, fordi værdien har fire cifre. Kubebaseret kode kan ikke registrere dem, hvilket er grunden til, at eksponenten skal følge ciffertællingen.

Et perfekt tal er lig med summen af ​​dets divisorer, så 6 kvalificerer sig gennem 1 plus 2 plus 3. Et Armstrong-tal er lig med summen af ​​dets potenser af cifre. De to definitioner deler ingen aritmetik og overlapper sjældent hinanden.

Math.pow() returnerer en double, så en cast tilbage til int er nødvendig, og afrundingsfejl bliver mulige. For en fast kube er digit*digit*digit hurtigere og præcis. Math.pow() fortjener kun sin plads, når eksponenten varierer med antallet af cifre.

Ja. En hjælpemetode kan tage arbejdsværdien, lægge det sidste ciffer med power til en akkumulator og kalde sig selv med tallet divideret med 10. Den læser godt, selvom loop-versionen undgår de ekstra stakrammer.

Moderne assistenter kan producere en pass-by-pass trace. gentag løkken i et letforståeligt sprog og foreslå kanttilfælde såsom 0 eller et negativt input. Bekræft trace mod det rigtige konsoloutput, fordi genererede gennemgange lejlighedsvis springer en iteration over.

GitHub Copilot fuldfører normalt løkken alene fra metodenavnet, men den hardcoder ofte kuben. Angiv kravet til cifferantal i prompten, og kompiler og test derefter forslaget, før du stoler på det.

Opsummer dette indlæg med: