1. Concept
Tout d'abord, comprenons ce qu'est un numéro parfait?
Description du problème: Si un nombre naturel, la somme de tous ses vrais facteurs (c'est-à-dire des diviseurs autres que lui-même) est exactement égal à elle, et ce nombre est appelé nombre complet. Abrégé comme "numéro fini"
Par exemple,
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064
Selon la définition du numéro fini, il n'est pas trop difficile de résoudre le numéro à l'aide du programme. Tout d'abord, résolvez tous les vrais facteurs de ce nombre, puis ajoutez-les pour déterminer s'il lui est égal. Cependant, lorsque ce nombre est très faible, il n'y a pas de problème. Une fois que ce nombre dépasse une certaine valeur, le problème se pose et l'efficacité d'exécution du programme sera insultée.
Lorsque nous optimisons la logique de l'algorithme des programmes, nous considérons souvent une question: comment utiliser efficacement les caractéristiques des ordinateurs? Y a-t-il beaucoup de travail inutile répété dans l'algorithme qu'il définit? En considérant ce problème dans cette ligne de pensée, nous obtiendrons bientôt une autre solution.
2. Description
2.1 Analyse
Ici, allons-nous facilement penser au facteur de décomposition que nous avons mentionné précédemment? Oui, lors de la résolution de nombres parfaits, nous utiliserons des facteurs de décomposition. D'une manière générale, la résolution d'un nombre parfait passera par trois étapes:
1. Trouvez un certain nombre de nombres premiers
2. Utilisez le tableau des nombres premiers pour trouver la factorisation du numéro spécifié
3. Utilisez la factorisation pour trouver tous les vrais facteurs et vérifier s'il s'agit d'un nombre parfait
2.2 Difficultés
Après un premier coup d'œil, il n'y a aucun problème avec les première et deuxième étapes. Nous en avons discuté dans les deux articles précédents. Les étudiants qui ne sont pas clairs à ce sujet peuvent le vérifier.
Le point clé est dans la troisième étape, comment trouver le véritable somme du facteur? La méthode est très simple. Vous devez d'abord savoir que l'ajout de tous les vrais facteurs (les étudiants qui ne connaissent pas le concept de vrais facteurs, vont chercher) et ajouter le nombre lui-même sera le double du nombre (certains étudiants ne savent pas, mais ils devraient le savoir maintenant, non?), Par exemple:
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
En fait, cette équation peut être convertie en: (erreur d'entrée de code, j'ai utilisé des captures d'écran)
Découvert? 2 et 7 sont à la fois factorisés, alors y a-t-il une simplification du programme?
2.3 Conclusion
Seule une factorisation est requise, et vous pouvez utiliser une boucle pour trouver la valeur après l'équation, et diviser la valeur de 2 pour être le vrai facteur Sum; Lorsque vous regardez l'équation pour la première fois, vous pouvez penser à utiliser la formule des séries d'équations pour le résoudre, mais vous utiliserez l'opération d'alimentation. Vous pouvez calculer la valeur après l'équation en même temps lors de la lecture du tableau de factorisation.
3. Code
import java.util.arraylist; // résoudre le nombre parfait de classe publique PerfectNumber {// passer une valeur et résoudre au moins le nombre de nombres parfaits publics static int [] moins (int ArrayList list = new ArrayList (); pour (int i = 1; i <= nombre; i ++) {int [] facteurs = facteur (pmimes, i); if (i == fsum (facteurs)) list.add (nouvel entier (i)); } int [] p = new int [list.size ()]; Objet [] objs = list.toArray (); for (int i = 0; i <p.length; i ++) {p [i] = ((entier) objs [i]). intValue (); } return p; } // Décomposer le facteur statique privé Int [] facteur (int [] nombre int) {int [] frecord = new int [numéro]; int k = 0; for (int i = 0; math.pow (primes [i], 2) <= nombre;) {if (nomber% primes [i] == 0) {Frecord [k] = primes [i]; k ++; Numéro / = Primes [i]; } else i ++; } frecord [k] = nombre; retour frecord; } // Factor SUM STATIQUE privé int fsum (int [] farr) {int i, r, s, q; i = 0; r = 1; S = 1; Q = 1; while (i <farr.length) {do {r * = farr [i]; q + = r; i ++; } while (i <farr.length - 1 && farr [i-1] == farr [i]); S * = q; r = 1; Q = 1; } return s / 2; } public static void main (String [] args) {int [] pn = perfectNumber.lessthan (1000); for (int i = 0; i <pn.length; i ++) {System.out.print (pn [i] + ""); } System.out.println (); }}Résumer
Ce qui précède concerne l'analyse du code numérique parfait dans cet article, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler!