La solution à ce problème ne peut pas être trouvé par le calcul simplement toutes les solutions possibles. La solution est si grande, qu'il faudra des jours (peut-être des années) pour calculer.
Il existe une solution plus intelligente utilisant les nombres premiers pour écrire les nombres.
L'exemple qui est donné (2520 est le plus petit nombre qui est divisible par les numéros 1 à 10) peut être écrit comme ceci:
1 = 1 (can be skipped) = 2^0 * 3^0 * 5^0 * 7^0
2 = 2 (prime) = 2^1 * 3^0 * 5^0 * 7^0
3 = 3 (prime) = 2^0 * 3^1 * 5^0 * 7^0
4 = 2^2 = 2^2 * 3^0 * 5^0 * 7^0
5 = 5 (prime) = 2^0 * 3^0 * 5^1 * 7^0
6 = 2 * 3 = 2^1 * 3^1 * 5^0 * 7^0
7 = 7 (prime) = 2^0 * 3^0 * 5^0 * 7^1
8 = 2^3 = 2^3 * 3^0 * 5^0 * 7^0
9 = 3^2 = 2^0 * 3^2 * 5^0 * 7^0
10= 2 * 5 = 2^1 * 3^0 * 5^1 * 7^0
Maintenant, le plus petit nombre qui peut être divisé par ceux-ci, peut être calculée en utilisant la puissance maximale qui est utilisé sur chaque prime:
2^3 * 3^2 * 5^1 * 7^1 = 2520
la même chose peut être réalisée (même à la main) sur les numéros de 1 à 20
Dernière touche: la réponse est plus grande que 100.000.000 mais moins qu'un milliard, il peut être calculée en quelques minutes si elle est faite efficacement
Marc a déjà donné une réponse parfaite. Alternativement: Comme chaque nombre doit être divisible par 20, 'num + = 20' vous donnera une accélération de 20x. En outre, utilisez 'for i in 2..20' car chaque nombre est divisible par 1 – schnaader
Comme une note de style: Votre code pourrait être écrit plus idiomatiquement comme' inf = 1.0/0.0; num = (1..inf) .find {| n | (1.20) .all? {| i | x% i == 0}} '- mais cela ne changerait pas le fait que cela soit trop long à calculer. – sepp2k
Juste vérifié ma version légèrement optimisée proposée dans Ruby. Cela prend environ 1 minute ici ce qui est difficile à la limite de Project Euler et beaucoup plus lent que ma version C++ qui fait la même chose en 2 secondes. – schnaader