Αριθμός Armstrong στο πρόγραμμα JAVA με χρήση βρόχου For
⚡ Έξυπνη Σύνοψη
Οι αριθμοί Armstrong ισούνται με το άθροισμα των δικών τους ψηφίων υψωμένο στη δύναμη του αριθμού των ψηφίων, και τα δύο Java Τα παρακάτω προγράμματα ελέγχουν μία μόνο τιμή και απαριθμούν κάθε αριθμό Armstrong κάτω από το χίλια.
Τι είναι ο αριθμός 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
Πριν διαβάσετε τον κώδικα, είναι χρήσιμο να δείτε την αριθμητική που επαναλαμβάνουν και τα δύο προγράμματα. Ο έλεγχος χρειάζεται μόνο τρεις λειτουργίες: αφαιρέστε το τελευταίο ψηφίο, ανεβάστε το στην απαιτούμενη δύναμη και μειώστε τον αριθμό κατά μία θέση.
- Αντιγράψτε την είσοδο σε ένα λειτουργικό μεταβλητή έτσι ώστε η αρχική τιμή να διατηρείται για την τελική σύγκριση.
- Πάρτε το τελευταίο ψηφίο με τον τελεστή modulo,
digit = tempNumber % 10. - Υψώστε αυτό το ψηφίο στη δύναμη του αριθμού των ψηφίων και προσθέστε το σε ένα τρέχον άθροισμα.
- Διαγράψτε το τελευταίο ψηφίο με ακέραια διαίρεση,
tempNumber /= 10. - Επαναλάβετε μέχρι η μεταβλητή εργασίας να φτάσει στο 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 ασκήσεις προγράμματος και συστοιχίας όπως τύπος φυσαλίδων και είδος εισαγωγής.
