Αριθμός Armstrong στο πρόγραμμα JAVA με χρήση βρόχου For

⚡ Έξυπνη Σύνοψη

Οι αριθμοί Armstrong ισούνται με το άθροισμα των δικών τους ψηφίων υψωμένο στη δύναμη του αριθμού των ψηφίων, και τα δύο Java Τα παρακάτω προγράμματα ελέγχουν μία μόνο τιμή και απαριθμούν κάθε αριθμό Armstrong κάτω από το χίλια.

  • 🔘 Ορισμός: Για έναν n-ψήφιο αριθμό, κάθε ψηφίο υψώνεται στη δύναμη n και τα αποτελέσματα προστίθενται.
  • ☑️ Παράδειγμα εργασίας: Το 370 πληροί τις προϋποθέσεις επειδή το 3³ συν 7³ συν 0³ επιστρέφει ακριβώς 370.
  • Digit Extraction: Ο τελεστής modulo αφαιρεί το τελευταίο ψηφίο και η ακέραια διαίρεση μειώνει τον αριθμό σε κάθε πέρασμα.
  • 🧪 Δύο Προγράμματα: Το ένα δοκιμάζει μια κωδικοποιημένη τιμή 153, το άλλο επαναλαμβάνει κάθε αριθμό από το 0 έως το 999.
  • Γνωστό Όριο: Η κύβωση κάθε ψηφίου λειτουργεί μόνο για τριψήφιες τιμές, επομένως τα μεγαλύτερα εύρη χρειάζονται τη δύναμη του n.
  • 📊 Περίπλοκο: Και τα δύο προγράμματα εκτελούνται σε χρόνο O(d) ανά αριθμό και χρησιμοποιούν επιπλέον μνήμη O(1).

Αριθμός Άρμστρονγκ σε Java πρόγραμμα χρησιμοποιώντας έναν βρόχο for

Τι είναι ο αριθμός Armstrong;

Σε έναν Αριθμό Άρμστρονγκ, το άθροισμα της ισχύος των μεμονωμένων ψηφίων είναι ίσο με τον ίδιο τον αριθμό.

Με άλλα λόγια ισχύει η ακόλουθη εξίσωση

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

n είναι ο αριθμός των ψηφίων στον αριθμό

Για παράδειγμα, αυτός είναι ένας 3ψήφιος αριθμός Armstrong

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

Παραδείγματα Άρμστρονγκ Numbers

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

Κάθε μονοψήφια τιμή από το 0 έως το 9 ικανοποιεί τον κανόνα σε μικρό βαθμό, επειδή ένας μονοψήφιος αριθμός υψωμένος στη δύναμη ενός επιστρέφει τον εαυτό του. Το πλήρες σύνολο των τριψήφιων αριθμών Armstrong είναι τα 153, 370, 371 και 407, ενώ τα 1634, 8208 και 9474 είναι τα τετραψήφια μέλη. Οι μαθηματικοί ονομάζουν επίσης αυτές τις τιμές ναρκισσιστικούς αριθμούς, καθώς ο καθένας αναπαράγεται από τα δικά του ψηφία.

Ας το γράψουμε σε ένα πρόγραμμα:

Πώς λειτουργεί ο αλγόριθμος αριθμών Armstrong

Πριν διαβάσετε τον κώδικα, είναι χρήσιμο να δείτε την αριθμητική που επαναλαμβάνουν και τα δύο προγράμματα. Ο έλεγχος χρειάζεται μόνο τρεις λειτουργίες: αφαιρέστε το τελευταίο ψηφίο, ανεβάστε το στην απαιτούμενη δύναμη και μειώστε τον αριθμό κατά μία θέση.

  1. Αντιγράψτε την είσοδο σε ένα λειτουργικό μεταβλητή έτσι ώστε η αρχική τιμή να διατηρείται για την τελική σύγκριση.
  2. Πάρτε το τελευταίο ψηφίο με τον τελεστή modulo, digit = tempNumber % 10.
  3. Υψώστε αυτό το ψηφίο στη δύναμη του αριθμού των ψηφίων και προσθέστε το σε ένα τρέχον άθροισμα.
  4. Διαγράψτε το τελευταίο ψηφίο με ακέραια διαίρεση, tempNumber /= 10.
  5. Επαναλάβετε μέχρι η μεταβλητή εργασίας να φτάσει στο 0 και, στη συνέχεια, συγκρίνετε το τρέχον σύνολο με τον αρχικό αριθμό.

Εκτελώντας αυτά τα βήματα πάνω από 153 παράγεται το tracε παρακάτω. Κάθε τιμή στον πίνακα εκτυπώνεται από το πρώτο πρόγραμμα, επομένως η έξοδος μπορεί να αντιστοιχιστεί γραμμή προς γραμμή κατά την εκμάθηση του βρόχου.

Πέρασμα προσωρινός αριθμός ψηφίο digitCubeSum
1 153 3 27
2 15 5 152
3 1 1 153
έξοδος 0 - Το 153 ισούται με 153, άρα το 153 είναι αριθμός Armstrong.

Ένας σημαντικός περιορισμός. Και τα δύο προγράμματα πολλαπλασιάζουν το ψηφίο με τον εαυτό του τρεις φορές, η οποία είναι η σωστή δύναμη μόνο όταν η είσοδος έχει ακριβώς τρία ψηφία. Ο γενικός κανόνας ανεβάζει κάθε ψηφίο στη δύναμη n, όπου n είναι ο αριθμός των ψηφίων, επομένως μια τετραψήφια τιμή όπως το 8208 χρειάζεται μια τέταρτη δύναμη και θα χαθεί από τον κώδικα που βασίζεται σε κύβους. Η μέτρηση των ψηφίων πρώτα και η ανύψωση του καθενός σε αυτήν τη δύναμη είναι αυτό που μετατρέπει τη ρουτίνα σε μια γενική δοκιμή.

Με την αριθμητική εκκαθάριση, το πρώτο πρόγραμμα την εφαρμόζει σε μία μόνο κωδικοποιημένη τιμή.

Java Πρόγραμμα για να ελέγξετε εάν ένας αριθμός είναι Armstrong Number

Η παρακάτω κλάση αποθηκεύει τον υποψήφιο σε inputArmstrongNumber και εκτυπώνει τις μεταβλητές εργασίας σε κάθε πέρασμα, γεγονός που καθιστά το Java βρόχος εύκολος στην παρακολούθηση σε μια κονσόλα.

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

Μεταγλώττιση και εκτέλεση της κλάσης από τη ρίζα του έργου. Επειδή το αρχείο δηλώνει package com.guru99, πρέπει να βρίσκεται σε αντίστοιχη θέση com/guru99 φάκελο ή το περιβάλλον εκτέλεσης αναφέρει ένα σφάλμα "δεν βρέθηκε η κλάση". Αλλαγή της τιμής στον inputArmstrongNumber μια γραμμή είναι το μόνο που χρειάζεται για να δοκιμάσετε έναν άλλο υποψήφιο.

Παραγωγή

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

Ο έλεγχος μίας τιμής κάθε φορά είναι χρήσιμος για tracing, αλλά η ίδια λογική κλιμακώνεται σε ένα ολόκληρο εύρος με αναδίπλωσηping σε έναν εξωτερικό βρόχο.

Java Πρόγραμμα εκτύπωσης αριθμών Armstrong από 0 έως 999

Η δεύτερη έκδοση διατηρεί το ίδιο εσωτερικό while βρόχο και προσθέτει ένα for βρόχος που διασχίζει την περιοχή. Σημειώστε ότι digitCubeSum επαναφέρεται στο 0 στην αρχή κάθε πάσας, η οποία είναι η λεπτομέρεια που ξεχνούν οι περισσότεροι αρχάριοι.

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

Παραγωγή

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

Η λίστα σταματά στο 1 αντί να συνεχίζει στο 9, επειδή ο κύβος ενός μονοψήφιου ψηφίου ταιριάζει με το ίδιο το ψηφίο μόνο για το 0 και το 1. Η ανύψωση κάθε ψηφίου στη δύναμη του αριθμού των ψηφίων θα επέστρεφε και τις δέκα μονοψήφιες τιμές, η οποία είναι η ίδια γενίκευση που περιγράφηκε προηγουμένως.

Και οι δύο καταχωρίσεις είναι αρκετά σύντομες για να συγκριθούν, επομένως αξίζει να αναφερθεί ρητά το κόστος της προσέγγισης.

Χρονική και χωρική πολυπλοκότητα του προγράμματος αριθμών Armstrong

Ο εσωτερικός βρόχος διαιρεί την λειτουργική μεταβλητή με το 10 σε κάθε πέρασμα, επομένως εκτελείται μία φορά ανά ψηφίο αντί για μία φορά ανά μονάδα του αριθμού. Αυτό καθιστά τον έλεγχο μίας τιμής εξαιρετικά φθηνό και παραμένει φθηνός καθώς η είσοδος αυξάνεται.

Πρόγραμμα Χρονική πολυπλοκότητα Πολυπλοκότητα χώρου
Ελέγξτε έναν αριθμό O(d), όπου d είναι ο αριθμός των ψηφίων Ο (1)
Σάρωση εύρους N αριθμών O(N × d) Ο (1)

Επειδή το d ισούται με log10(αριθμός) στρογγυλοποιημένος προς τα πάνω, ο μοναδικός έλεγχος είναι ουσιαστικά λογαριθμικός στην τιμή που ελέγχεται. Μόνο τρία int Οι μεταβλητές κατανέμονται πάντα και δεν δημιουργείται πίνακας ή συλλογή, γι' αυτό και το κόστος χώρου παραμένει σταθερό ανεξάρτητα από το πόσο μεγάλο γίνεται το εύρος.

Δύο πρακτικές σημειώσεις προκύπτουν από αυτό. Πρώτον, η σάρωση εύρους κυριαρχείται από το N, επομένως η εκτύπωση αριθμών Armstrong έως ένα εκατομμύριο κοστίζει περίπου χίλιες φορές περισσότερο από την εκτύπωση έως και χίλιους. Δεύτερον, ένα int υπερχειλίζει πάνω από 2,147,483,647, επομένως χρειάζεται αναζήτηση σε πολύ μεγάλα εύρη long τόσο για τον υποψήφιο όσο και για το τρέχον άθροισμα. Το ίδιο ψηφίο-εξ.tracτο μοτίβο αγωγής εμφανίζεται σε πολλές ασκήσεις για αρχάριους, συμπεριλαμβανομένης της έλεγχος πρώτων αριθμών, Σειρά Fibonacci ασκήσεις προγράμματος και συστοιχίας όπως τύπος φυσαλίδων και είδος εισαγωγής.

Συχνές Ερωτήσεις

Ναι. Αν κυβίσουμε κάθε ψηφίο, προκύπτει 27 συν 343 συν 1, το οποίο δίνει 371, επομένως η τιμή αναπαράγεται από μόνη της. Το παραπάνω πρόγραμμα εύρους τιμών την εκτυπώνει δίπλα στα 153, 370 και 407.

Το όνομα αντικατοπτρίζει την ίδια την ιδιότητα: ο αριθμός αποτελείται εξ ολοκλήρου από τα δικά του ψηφία, επομένως φαίνεται να θαυμάζει την αντανάκλασή του. Και οι δύο όροι περιγράφουν τον ίδιο κανόνα και το άθροισμα δυνάμεων ψηφίων ονομάζεται μερικές φορές υπερσυντέλικος ψηφιακός αναλλοίωτος.

Υπάρχουν τρεις: 1634, 8208 και 9474. Κάθε ψηφίο υψώνεται στην τέταρτη δύναμη επειδή η τιμή έχει τέσσερα ψηφία. Ο κώδικας που βασίζεται σε κύβους δεν μπορεί να τα ανιχνεύσει, γι' αυτό και ο εκθέτης πρέπει να ακολουθεί τον αριθμό των ψηφίων.

Ένας τέλειος αριθμός ισούται με το άθροισμα των γνήσιων διαιρετών του, επομένως το 6 ισούται με το 1 συν 2 συν 3. Ένας αριθμός Armstrong ισούται με το άθροισμα των δυνάμεων των ψηφίων του. Οι δύο ορισμοί δεν έχουν κοινή αριθμητική και σπάνια επικαλύπτονται.

Η συνάρτηση Math.pow() επιστρέφει διπλό αριθμό, επομένως απαιτείται επαναφορά σε ακέραιο αριθμό και καθίστανται πιθανά σφάλματα στρογγυλοποίησης. Για έναν σταθερό κύβο, το digit*digit*digit είναι ταχύτερο και ακριβέστερο. Η συνάρτηση Math.pow() κερδίζει τη θέση της μόνο όταν ο εκθέτης μεταβάλλεται με τον αριθμό των ψηφίων.

Ναι. Μια βοηθητική μέθοδος μπορεί να πάρει την τιμή εργασίας, να προσθέσει το τελευταίο ψηφίο που ενεργοποιείται σε έναν συσσωρευτή και να καλέσει τον εαυτό της με τον αριθμό διαιρούμενο με το 10. Διαβάζει καλά, αν και η έκδοση βρόχου αποφεύγει τα επιπλέον πλαίσια στοίβας.

Οι σύγχρονοι βοηθοί μπορούν να παράγουν ένα πέρασμα-παρακάμψη tracε., επαναδιατυπώστε τον βρόχο σε απλή γλώσσα και προτείνετε περιπτώσεις ακμών όπως 0 ή αρνητική είσοδο. Επαληθεύστε το trace σε σχέση με την πραγματική έξοδο της κονσόλας, επειδή οι δημιουργούμενες οδηγίες περιστασιακά παραλείπουν μια επανάληψη.

GitHub Copilot συνήθως ολοκληρώνει τον βρόχο μόνο από το όνομα της μεθόδου, αλλά συχνά κωδικοποιεί τον κύβο. Δηλώστε την απαίτηση αριθμού ψηφίων στην προτροπή και, στη συνέχεια, μεταγλωττίστε και δοκιμάστε την πρόταση πριν την εμπιστευτείτε.

Συνοψίστε αυτήν την ανάρτηση με: