Kleinste Zahl, die durch alle Zahlen von 1 bis 20 teilbar ist?

8

Ich habe dieses Problem [ Projekt Euler Problem 5 ], aber sehr schlechte Art der Programmierung , siehe den Code in C ++,

%Vor%

Ich löste das in C ++ und steckte in einer Schleife, wie würde man diesen Schritt lösen ......

  • betrachte num = 20 und teile es durch Zahlen von 1 bis 20
  • überprüfe, ob alle Reste Null sind,
  • Wenn ja, beenden Sie und zeigen Sie die Ausgabe num
  • an
  • oder sonst num ++

Ich weiß nicht, wie man Kontrollstrukturen benutzt, also tat dieser Schritt

%Vor%

Wie kann ich das richtig programmieren?

Antwort für dieses Problem ist:

%Vor%     
Abhilash Muthuraj 24.01.2010, 12:38
quelle

12 Antworten

10

Es gibt einen schnelleren Weg, das Problem mit der Zahlentheorie zu lösen. Andere Antworten enthalten Hinweise, wie dies zu tun ist. Diese Antwort bezieht sich nur auf eine bessere Möglichkeit, die Bedingung if in Ihren ursprünglichen Code zu schreiben.

Wenn Sie nur die lange Bedingung ersetzen möchten, können Sie sie in einer for-Schleife besser ausdrücken:

%Vor%

wird zu:

%Vor%

Der Stil ist nicht großartig, aber ich denke, das ist, was Sie gesucht haben.

    
Pascal Cuoq 24.01.2010, 13:11
quelle
19

Die kleinste Zahl, die durch zwei Zahlen teilbar ist, ist das LCM dieser beiden Zahlen. Tatsächlich ist die kleinste Zahl, die durch eine Menge von N Zahlen x1..xN teilbar ist, die LCM dieser Zahlen. Es ist einfach, das LCM von zwei Zahlen zu berechnen (siehe den Wikipedia-Artikel), und Sie können auf N Zahlen erweitern, indem Sie die Tatsache ausnutzen, dass

%Vor%

Hinweis: Achten Sie auf Überläufe.

Code (in Python):

%Vor%     
MAK 24.01.2010 12:59
quelle
15

Rechne alle Ganzzahlen von 1 bis 20 in ihre Primfaktorzerlegungen ein. Zum Beispiel: Faktor 18 als 18 = 3 ^ 2 * 2. Nun finden Sie für jede Primzahl p , die in der Primfaktorzerlegung einer ganzen Zahl im Bereich 1 bis 20 vorkommt, den maximalen Exponenten, den sie unter all diesen Primzahlen hat Faktorisierungen. Zum Beispiel wird die Primzahl 3 den Exponenten 2 haben, weil sie in der Faktorisierung von 18 als 3 ^ 2 erscheint und wenn sie in jeder Primfaktorzerlegung mit einem Exponenten von 3 (dh 3 ^ 3) erscheinen würde muss mindestens so groß sein wie 3 ^ 3 = 27 was außerhalb des Bereichs von 1 bis 20 liegt. Nun sammle alle diese Primzahlen mit ihrem entsprechenden Exponenten und du hast die Antwort.

Finden wir als Beispiel die kleinste Zahl, die durch alle Zahlen von 1 bis 4 teilbar ist.

%Vor%

Die angezeigten Primzahlen sind 2 und 3 . Wir stellen fest, dass der maximale Exponent von 2 2 und der maximale Exponent von 3 1 ist. Die kleinste Zahl, die durch alle Zahlen von 1 bis 4 teilbar ist, ist also 2 ^ 2 * 3 = 12.

Hier ist eine relativ einfache Implementierung.

%Vor%

Beispielausgabe:

%Vor%     
jason 24.01.2010 12:58
quelle
4

Siehe Ссылка Mit zwei Zahlen a und b können Sie gcd (a, b) berechnen und die kleinste Zahl, die durch beide teilbar ist, ist a * b / gcd (a, b). Die naheliegendste Sache ist dann, eine Art Laufsumme davon zu halten und die Zahlen, die Sie interessieren, eins nach dem anderen hinzuzufügen: Sie haben eine Antwort bis jetzt A und fügen die nächste Zahl X_i hinzu, indem Sie

A '= A * X_i / (gcd (A, X_i))

Sie können sehen, dass dies tatsächlich funktioniert, indem Sie überlegen, was Sie bekommen, wenn Sie alles faktorisieren und als Produkte von Primzahlen ausschreiben. Dies sollte Ihnen erlauben, die Antwort von Hand auszuarbeiten.

    
mcdowella 24.01.2010 12:58
quelle
2

Hinweis:

statt die Zahl um 1 zu erhöhen, können Sie sie um 20 erhöhen (wird viel schneller arbeiten). Natürlich kann es auch andere Verbesserungen geben, wenn ich später Zeit habe, denke ich darüber nach. Hoffe ich habe dir ein bisschen geholfen.

    
George 24.01.2010 13:00
quelle
1

Die betreffende Zahl ist das kleinste gemeinsame Vielfache der Zahlen 1 bis 20.

Weil ich faul bin, lass ** Exponentiation darstellen. Sei kapow (x, y) der ganzzahlige Teil des Logs zur Basis x von y. (Zum Beispiel, Kapow (2,8) = 3, Kapow (2,9) = 3, Kapow (3,9) = 2.

Die Primzahlen kleiner oder gleich 20 sind 2, 3, 5, 7, 11, 13 und 17. Das LCM ist

Weil sqrt (20) & lt; 5, wir wissen, dass Kapow (i, 20) für i & gt; = 5 ist 1. Durch Inspektion ist das LCM

  

LCM = 2 Kapow (2,20) * 3 Kapow (3,20)   * 5 * 7 * 11 * 13 * 17 * 19

was ist

  

LCM = 2 4 * 3 2 * 5 * 7 * 11 * 13 *   17 * 19

oder

  

LCM = 16 * 9 * 5 * 7 * 11 * 13 * 17 *   19

    
John R. Strohm 25.01.2010 23:33
quelle
1
%Vor%

Der Vektor wird zum Speichern der Faktoren der kleinsten Zahl verwendet.

    
vector_L 17.10.2013 11:32
quelle
0

Dies kann Ihnen helfen Ссылка

Die Primfaktorzerlegung von 232.792.560

2 ^ 4 • 3 ^ 2 • 5 • 7 • 11 • 13 • 17 • 19

    
Pentium10 24.01.2010 13:12
quelle
0

Ruby Cheat:

%Vor%     
zengr 16.09.2010 06:49
quelle
0

dies ist in c

geschrieben %Vor%

}

    
Indrajith Indraprastham 03.04.2013 08:30
quelle
0

Hier ist eine C # -Version von @ MAKs Antwort, vielleicht gibt es List reduce in C #, ich habe etwas online gefunden, aber keine schnellen Beispiele, also habe ich einfach eine for-Schleife anstelle von reduce :

von Python verwendet %Vor%     
Brian Ogden 23.10.2015 23:45
quelle
-3

Wenn Sie das Maximum n angeben, möchten Sie die kleinste um 1 bis 20 teilbare Zahl zurückgeben.

Schauen wir uns die Menge von 1 bis 20 an. Zunächst enthält sie eine Anzahl von Primzahlen, nämlich:

%Vor%

Also, weil es mit 19 teilbar sein muss, können Sie nur Vielfache von 19 überprüfen, weil 19 eine Primzahl ist. Danach prüfen Sie, ob es durch das darunter liegende geteilt werden kann usw. Wenn die Zahl durch alle Primzahlen erfolgreich geteilt werden kann, kann sie durch die Zahlen 1 bis 20 geteilt werden.

%Vor%     
knight666 24.01.2010 12:55
quelle

Tags und Links