1. Konzept
Lassen Sie uns zunächst verstehen, was perfekte Zahl ist?
Problembeschreibung: Wenn eine natürliche Zahl, ist die Summe aller wahren Faktoren (d. H. Andere Divisoren als sich selbst) genau gleich, und diese Zahl wird als vollständige Zahl bezeichnet. Abgekürzt als "fertige Nummer"
Zum Beispiel,
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
Nach der Definition der fertigen Zahl ist es nicht zu schwierig, die Nummer mit dem Programm zu lösen. Lösen Sie zunächst alle tatsächlichen Faktoren dieser Zahl und fügen Sie sie hinzu, um festzustellen, ob sie gleich ist. Wenn diese Zahl jedoch sehr klein ist, gibt es kein Problem. Sobald diese Zahl einen bestimmten Wert überschreitet, entsteht das Problem und die Ausführungseffizienz des Programms wird beleidigt.
Wenn wir die Algorithmuslogik von Programmen optimieren, betrachten wir häufig eine Frage: Wie nutzen Sie die Eigenschaften von Computern effizient? Gibt es viele wiederholte nutzlose Arbeiten im Algorithmus, den es definiert? Durch die Betrachtung dieses Problems entlang dieser Denkweise werden wir bald eine andere Lösung bekommen.
2. Beschreibung
2.1 Analyse
Werden wir hier leicht an den zuvor erwähnten Zersetzungsfaktor denken? Ja, wenn wir perfekte Zahlen lösen, verwenden wir Zersetzungsfaktoren. Im Allgemeinen wird die Lösung einer perfekten Zahl drei Schritte durchlaufen:
1. Finden Sie eine bestimmte Anzahl von Primzahlen
2. Verwenden Sie die Primzahl -Tabelle, um die Faktorisierung der angegebenen Zahl zu ermitteln
3.. Verwenden Sie die Faktorisierung, um alle wahren Faktoren zu finden und zu überprüfen, ob es sich um eine perfekte Zahl handelt
2.2 Schwierigkeiten
Nach einem ersten Blick gibt es kein Problem mit der ersten und zweiten Schritte. Wir haben es in den beiden vorherigen Artikeln besprochen. Schüler, die sich nicht darüber klar machen, können es überprüfen.
Der entscheidende Punkt ist im dritten Schritt. Wie findet man den wahren Faktorsumme? Die Methode ist sehr einfach. Sie müssen zunächst wissen, dass das Hinzufügen aller wahren Faktoren (Schüler, die das Konzept der wahren Faktoren nicht kennen, einen Blick darauf werfen) und die Zahl selbst hinzufügen (einige Schüler wissen es nicht, aber sie sollten es jetzt wissen, oder?) Zum Beispiel:
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
Tatsächlich kann diese Gleichung konvertiert werden in: (Code -Eingangsfehler habe ich Screenshots verwendet)
Entdeckt? 2 und 7 werden beide faktorisiert. Gibt es also eine Vereinfachung des Programms?
2.3 Schlussfolgerung
Es ist nur eine Faktorisierung erforderlich, und Sie können eine Schleife verwenden, um den Wert nach der Gleichung zu finden und den Wert durch 2 als die wahre Faktorsumme zu teilen. Wenn Sie sich die Gleichung zum ersten Mal ansehen, können Sie sich an die Gleichungsserie -Formel zur Lösung der Gleichungsserie überlegen, aber Sie werden den Leistungsbetrieb verwenden. Sie können den Wert nach der Gleichung gleichzeitig beim Lesen des Faktorisierungsarrays berechnen.
3. Code
Import Java.util.ArrayList; // die perfekte Zahl public class imperverteilieren {// Lösen Sie einen Wert und löschen Sie mindestens wie viele perfekte Zahlen public static int [] LessHan (int number) {int [] Primes = Prime.findprimes (Nummer); ArrayList List = new ArrayList (); für (int i = 1; i <= nummer; i ++) {int [] faktoren = faktor (primes, i); if (i == fsum (faktoren)) list.add (New Integer (i)); } int [] p = new int [list.size ()]; Object [] objs = list.toArray (); für (int i = 0; i <p.Length; i ++) {p [i] = ((integer) objs [i]). intValue (); } return p; } // den Faktor private statische statische int [] faktor (int [] primes, int nummer) {int [] frecord = new int [number]; int k = 0; für (int i = 0; math.pow (primes [i], 2) <= nummer;) {if (number % primes [i] == 0) {frecord [k] = primes [i]; K ++; Zahl /= Primes [i]; } else i ++; } frecord [k] = nummer; Frecord zurückgeben; } // Faktor Summe private statische 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.lessHan (1000); für (int i = 0; i <pn.length; i ++) {System.out.print (pn [i]+""); } System.out.println (); }}Zusammenfassen
In dem oben genannten dreht sich alles um die Analyse des perfekten Zahlencode in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen!