JAVA Programında For Döngüsü Kullanan Armstrong Sayısı

⚡ Akıllı Özet

Armstrong sayıları, kendi rakamlarının rakam sayısının kuvvetine yükseltilmiş hallerinin toplamına eşittir ve iki rakamın toplamı da bu kuvvete yükseltilmiş halde bulunur. Java Aşağıdaki programlar tek bir değeri kontrol eder ve binin altındaki tüm Armstrong sayılarını listeler.

  • 🔘 Tanım: n basamaklı bir sayı için, her basamak n. kuvvete yükseltilir ve sonuçlar toplanır.
  • ☑️ Örnek Uygulama: 370, 3³ artı 7³ artı 0³'ün tam olarak 370'i vermesi nedeniyle geçerlidir.
  • Digit Extraction: Modulo operatörü son rakamı kaldırır ve tam sayı bölmesi her geçişte sayıyı kısaltır.
  • 🧪 İki Program: Birinde önceden belirlenmiş 153 değeri test edilirken, diğerinde 0'dan 999'a kadar her sayı döngüyle denenir.
  • Bilinen Limit: Her bir rakamın küpünü almak yalnızca üç basamaklı değerler için işe yarar, bu nedenle daha geniş aralıklar için n'nin kuvvetini kullanmak gerekir.
  • 📊 karmaşıklık: Her iki program da sayı başına O(d) zaman alır ve O(1) ek bellek kullanır.

Armstrong'un sayısı Java for döngüsü kullanan program

Armstrong Sayısı Nedir?

Armstrong Sayısında her bir rakamın kuvvetlerinin toplamı sayının kendisine eşittir.

Başka bir deyişle, aşağıdaki denklem doğru olacaktır

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

n sayıdaki basamak sayısıdır

Örneğin bu 3 haneli bir Armstrong numarasıdır

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

Armstrong örnekleri Numbers

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

0'dan 9'a kadar olan her tek basamaklı sayı, kuralı kolayca karşılar, çünkü tek basamaklı bir sayının birinci kuvvete yükseltilmesi kendisini verir. Üç basamaklı Armstrong sayılarının tam kümesi 153, 370, 371 ve 407 iken, dört basamaklı üyeleri 1634, 8208 ve 9474'tür. Matematikçiler bu değerlere narsisistik sayılar da derler, çünkü her biri kendi rakamlarından kendisini yeniden üretir.

Bunu bir programa yazalım:

Armstrong Sayısı Algoritması Nasıl Çalışır?

Kodu okumadan önce, her iki programın da tekrarladığı aritmetik işlemleri görmek faydalı olacaktır. Kontrol işlemi yalnızca üç adımdan oluşur: son rakamı kaldırmak, sayıyı gerekli kuvvete yükseltmek ve sayıyı bir basamak kısaltmak.

  1. Girdiğiniz girdiyi bir çalışma alanına kopyalayın. değişken Bu sayede orijinal değer nihai karşılaştırma için korunmuş olur.
  2. Son rakamı modül operatörüyle alın, digit = tempNumber % 10.
  3. O rakamı rakam sayısının kuvvetine yükseltin ve toplam rakama ekleyin.
  4. Tam sayı bölme işleminde son rakamı atın. tempNumber /= 10.
  5. Çalışma değişkeni 0'a ulaşana kadar işlemi tekrarlayın, ardından elde edilen toplamı orijinal sayıyla karşılaştırın.

Bu adımları 153 üzerinden çalıştırmak şu sonucu verir: tracAşağıda e harfi yer almaktadır. Tablodaki her değer ilk program tarafından yazdırılır, böylece döngüyü öğrenirken çıktı satır satır eşleştirilebilir.

Geçiş geçiciNumara basamak digitCubeSum
1 153 3 27
2 15 5 152
3 1 1 153
Çıkış 0 - 153, 153'e eşittir, dolayısıyla 153 bir Armstrong sayısıdır.

Önemli bir sınırlama. Her iki program da rakamı kendisiyle üç kez çarpar; bu, yalnızca giriş tam olarak üç basamaklı olduğunda doğru kuvvettir. Genel kural, her rakamı n. kuvvete yükseltmektir; burada n, rakam sayısıdır. Dolayısıyla, 8208 gibi dört basamaklı bir değer dördüncü bir kuvvete ihtiyaç duyar ve küp tabanlı kod tarafından gözden kaçırılır. Önce rakamları sayıp her birini o kuvvete yükseltmek, rutini genel bir teste dönüştürür.

Hesaplamalar tamamlandıktan sonra, ilk program bunu tek bir sabit kodlanmış değere uygular.

Java Bir sayının Armstrong Sayısı olup olmadığını kontrol eden program

Aşağıdaki sınıf adayı şu şekilde saklar: inputArmstrongNumber ve her geçişte çalışma değişkenlerini yazdırır, bu da şunu sağlar: Java Konsolda takip edilmesi kolay döngü.

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

Sınıfı proje kök dizininden derleyin ve çalıştırın. Çünkü dosya şunu bildiriyor: package com.guru99Eşleşen bir yerde durması gerekiyor. com/guru99 klasörde veya çalışma zamanı sınıf bulunamadı hatası veriyor. Değeri değiştirmek inputArmstrongNumber Bir başka adayı test etmek için sadece bir satır yeterlidir.

Çıktı

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

Değerleri tek tek kontrol etmek şu açılardan faydalıdır: tracAncak aynı mantık, sarmalama yoluyla çok çeşitli alanlara uygulanabilir.ping Bunu dış bir döngüye yerleştirin.

Java 0'dan 999'a kadar Armstrong sayılarını yazdıran program

İkinci versiyon aynı iç yapıyı koruyor. while döngü ve bir ekler for Aralık boyunca dolaşan bir döngü. Şunu unutmayın ki... digitCubeSum Her geçişin başında sıfırlanır; bu, çoğu acemi kullanıcının unuttuğu bir detaydır.

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

Çıktı

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

Liste 9'a kadar devam etmek yerine 1'de duruyor çünkü tek basamaklı bir sayının küpü yalnızca 0 ve 1 için rakamın kendisiyle eşleşiyor. Bunun yerine her rakamı rakam sayısının kuvvetine yükseltmek, daha önce açıklanan genellemeyle aynı olan on tek basamaklı değerin tamamını döndürür.

Her iki liste de kıyaslama için yeterince kısa olduğundan, yaklaşımın maliyetini açıkça belirtmekte fayda var.

Armstrong Sayısı Programının Zaman ve Mekan Karmaşıklığı

İç döngü, her geçişte çalışma değişkenini 10'a böler, bu nedenle sayının her birimi için bir kez değil, her basamak için bir kez çalışır. Bu, tek değer kontrolünü son derece ucuz hale getirir ve girdi arttıkça da ucuz kalır.

Programı Zaman karmaşıklığı Alan karmaşıklığı
Bir numarayı işaretleyin O(d), burada d basamak sayısıdır. O (1)
N sayıdan oluşan bir aralığı tarayın. O(N × d) O (1)

Çünkü d logaritmaya eşittir.10(Sayı) yukarı yuvarlandığında, tek kontrol, test edilen değere göre etkili bir şekilde logaritmiktir. Sadece üç int Değişkenlere hiçbir zaman bellek tahsis edilmez ve hiçbir dizi veya koleksiyon oluşturulmaz; bu nedenle, aralık ne kadar büyük olursa olsun, alan maliyeti sabit kalır.

Bundan iki pratik sonuç çıkarılabilir. Birincisi, aralık taraması N'ye bağlıdır, bu nedenle Armstrong sayılarını bir milyona kadar yazdırmak, bin'e kadar yazdırmaktan yaklaşık bin kat daha pahalıdır. İkincisi, bir int 2,147,483,647'nin üzerinde taşma meydana geliyor, bu nedenle çok geniş aralıklarda arama yapılması gerekiyor. long Hem aday hem de toplam için aynı rakam geçerlidir.tracBu kalıp, başlangıç ​​seviyesindeki birçok alıştırmada karşımıza çıkar, bunlar arasında şunlar da bulunur: asal sayı kontrolü, Fibonacci serisi program ve dizi alıştırmaları gibi kabarcık sıralaması hem de ekleme türü.

SSS

Evet. Her rakamın küpünü almak 27 artı 343 artı 1'i verir, bu da 371'e eşittir, yani değer kendini tekrar eder. Yukarıdaki aralık programı bunu 153, 370 ve 407'nin yanına yazdırır.

İsim, özelliğin kendisini yansıtır: sayı tamamen kendi rakamlarından oluşur, bu nedenle kendi yansımasına hayran gibi görünür. Her iki terim de aynı kuralı tanımlar ve rakam-kuvvet toplamına bazen mükemmel dijital değişmez denir.

Üç tane var: 1634, 8208 ve 9474. Her rakamın dördüncü kuvveti, değerin dört basamaklı olmasından kaynaklanmaktadır. Küp tabanlı kodlar bunları algılayamaz, bu nedenle üs rakam sayısını takip etmelidir.

Mükemmel sayı, öz bölenlerinin toplamına eşittir; bu nedenle 6, 1 + 2 + 3 yoluyla bu tanıma uyar. Armstrong sayısı ise rakamlarının kuvvetlerinin toplamına eşittir. İki tanım arasında aritmetik bir ortak nokta yoktur ve nadiren örtüşürler.

Math.pow() bir double değer döndürdüğü için int'e geri dönüştürme gereklidir ve yuvarlama hataları olası hale gelir. Sabit bir küp için, digit*digit*digit daha hızlı ve doğrudur. Math.pow() yalnızca üssün basamak sayısıyla değiştiği durumlarda işe yarar.

Evet. Yardımcı bir yöntem, çalışma değerini alabilir, son basamağın üslü halini bir toplayıcıya ekleyebilir ve sayıyı 10'a bölerek kendini çağırabilir. Okunması kolaydır, ancak döngülü sürüm ekstra yığın çerçevelerinden kaçınır.

Modern asistanlar adım adım bir kılavuz oluşturabilirler. trace) Döngüyü sade bir dille yeniden ifade edin ve 0 veya negatif giriş gibi uç durumları önerin. Doğrulayın. tracOluşturulan kılavuzlar bazen bir yinelemeyi atladığı için, gerçek konsol çıktısına karşı e değeri kullanılır.

GitHub Yardımcı Pilotu Genellikle döngüyü yalnızca metot adından tamamlar, ancak sıklıkla küpü sabit kodlar. İstenen basamak sayısını belirtin, ardından öneriyi derleyip test edin ve ona güvenin.

Bu yazıyı şu şekilde özetleyin: