Quelques problèmes du projet Euler (corrigé)
Transcription
Quelques problèmes du projet Euler (corrigé)
ESIEE IGI-3005 TP no 2 (corrigé) 2014-2015 Quelques problèmes du projet Euler (corrigé) Le projet Euler ( Project Euler, http://projecteuler.net) est un ensemble de problèmes mathématico-informatiques, demandant des connaissances en mathématiques et en programmation pour être résolus. Chacun de ces problèmes peut être programmé en Java, C ou Python (ou en tout autre langage, et parfois même au papier-crayon), et, d’après les concepteurs du projet, chaque problème, s’il est correctement analysé, pourra être résolu par un programme s’exécutant en moins d’une minute même en utilisant un langage lent sur une machine ancienne. En vous inscrivant sur le site, vous pourrez soumettre une réponse à chaque problème (un nombre, une chaîne de caractères) et, si votre réponse est correcte, vous pourrez accéder à un fil de discussion (solutions, commentaires) correspondant à ce problème, ce qui vous donnera d’autres éléments de réflexion. Le site est très correct (votre inscription ne vous amènera pas de propositions d’achats, de spams, etc.). Un classement par niveau (un niveau tous les 25 problèmes résolus) vous permettra de juger votre progression et des récompenses vous seront accordées lorsque certains problèmes seront résolus. Voici les énoncés traduits en français des dix premiers problèmes du Project Euler . Prenez en connaissance, choisissez en quatre (un par demi-heure) et résolvez-les. Ne m’envoyez vos programmes que si vous les avez écrit vous-même et si vous voulez avoir un avis ou un déboguage. Note : certains calculs ou résultats dépassent la capacité des entiers standard (C ou Java). Documentez-vous et utilisez le type long long (en C) ou la classe BigInteger (en Java). Exercice 1. Multiples de 3 ou de 5 Si l’on écrit tous les entiers naturels positifs inférieurs à 10 et multiples de 3 ou de 5, on obtient 3, 5, 6 et 9. La somme de ces multiples vaut 23. Quelle est la somme de tous les nombres inférieurs à 1 000 qui sont multiples de 3 ou de 5 ? Corrigé *************************************************************************** 233168 Une première ébauche peut être la suivante : int somme_mult_3_5(int n) { int s = 0; int i; for (i = 0; i < n; ++i) { if (i % 3 == 0 || i % 5 == 0) { s += i; } } return s; } –1/6– ESIEE IGI-3005 TP no 2 (corrigé) 2014-2015 Puis on peut remarquer que les multiples de 3 inférieurs à n sont de la forme 3k avec 0 ≤ k < Pk=E( n−1 ) E(n/3) et donc que le somme des multiples de 3 inférieurs à n peut s’écrire k=0 3 3k, soit Pk=E( n−1 ) +1)E( n−1 (E( n−1 3 ) 3 ) 3 k=0 3 k, soit encore 3 . 2 Le même raisonnement pour les multiples de 5 et la constatation que si on compte les multiples de 3 et les multiples de 5, les multiples de 15 seront comptés deux fois nous amène au programme suivant : int somme_n(int n) { /* somme des n premiers nombres */ return (n * (n + 1)) / 2; } int somme_mult_3_5_v2(int n) { int m3, m5, m15; --n; m3 = n / 3; m5 = n / 5; m15 = n / 15; return 3 * somme_n(m3) + 5 * somme_n(m5) - 15 * somme_n(m15); } *************************************************************************** Exercice 2. Nombres de Fibonacci pairs Chaque nouveau terme de la suite de Fibonacci s’obtient en additionnant les deux derniers termes de la suite. En partant de 1 et 2, les termes de valeur inférieure à 100 sont : 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 La somme des termes pairs de la suite de Fibonacci de valeur inférieure à 100 vaut 44. Combien vaut la somme des termes pairs de la suite de Fibonacci de valeur inférieure à quatre millions ? Corrigé *************************************************************************** 4613732 *************************************************************************** Exercice 3. Plus grand facteur premier Les facteurs premiers de 13 195 sont 5, 7, 13 and 29. Quel est le plus grand facteur premier de 600 851 475 143 ? Corrigé *************************************************************************** 6857 *************************************************************************** –2/6– ESIEE IGI-3005 TP no 2 (corrigé) 2014-2015 Exercice 4. Plus grand produit palindrome Un nombre palindrome reste identique si on le lit de gauche à droite ou de droite à gauche. Le plus grand nombre palindrome produit de deux nombres à deux chiffres est 9 009 = 91 × 99. Quel est le plus grand nombre palindrome produit de deux nombres à trois chiffres ? Corrigé *************************************************************************** 906609 Un sous-problème est, étant donné un nombre, de reconnaître s’il est un palindrome. Un sous-sous-problème est, étant donné un nombre, de créer son retourné (2013–>3102). Ces sous-problèmes étant résolus, il suffira d’écrire un programme du style : record = 0; for (a = 0; a < 1000; ++a) { for (b = 0; b < 1000; ++b) { p = a * b; if (palindrome(p) and p > record) { record = p; } } } return record; Premier problème : retourné d’un nombre. En partant par exemple de 2013, on peut construire le tableau suivant : 2013 0 201 3 20 31 2 310 0 3102 On voit que dans chaque ligne, la première cellule est constituée des chiffres de la cellule du dessus sauf le dernier, et la seconde cellule est constituée de la muliplication par 10 de la cellule du dessus plus le dernier chiffre de la première cellule de la ligne du dessus. Soit : Tl,1 Tl+1,1 = E et Tl+1,2 = 10 Tl,2 + Tl,1 mod 10 10 La fonction C en découle quasi directement : int renverse(int n) { int r = 0; while (n != 0) { r = 10 * r + n % 10; n /= 10; } return r; } La fonction de test de palindrome est maintenant évidente : int estPalindrome (int n) { return renverse(n) == n; } et la version 1 du problème 4 du projet Euler : int Euler004_v01() { int a, b, p, maxi, record; maxi = 1000; record = 0 ; –3/6– TP no 2 (corrigé) ESIEE IGI-3005 2014-2015 for (a = 0; a < maxi; ++a) { for (b = 0; b < maxi; ++b) { p = a * b; if (estPalindrome(p) && p > record) { record = p; } } } return record; } On peut vérifier qu’il donne une solution. Pour l’optimiser : 1. la boucle sur b peut partir de a (on ira près de deux fois plus vite) 2. on peut inverser les deux composantes du test (vérifier si p est susceptible de battre le record, et seulement dans ce cas vérifier si c’est un palindrome) 3. analyser mathématiquement le problème et se rendre compte qu’un palindrome de 6 chiffres est forcément multiple de 11 et donc que a par exemple est un multiple de 11 (il faudra que b reparte de 0) *************************************************************************** Exercice 5. Plus petit multiple 2 520 est le plus petit entier divisible par chaque nombre de 1 à 10. Quel est le le plus petit entier divisible par tous les nombres de 1 à 20 ? Corrigé *************************************************************************** 232792560 *************************************************************************** Exercice 6. Différence entre le carré de la somme et la somme des carrés La somme des carrés des dix premiers entiers naturels positifs vaut 12 + 22 + . . . + 102 = 385 Le carré de la somme des dix premiers entiers naturels positifs vaut (1 + 2 + . . . + 10)2 = 552 = 3 025 La différence entre le carré de la somme des dix premiers entiers naturels positifs et la somme de leurs carrés vaut 3 025 − 385 = 2 640. Quelle est la différence entre le carré de la somme des cent premiers entiers naturels positifs et la somme de leurs carrés ? Corrigé *************************************************************************** 25164150 *************************************************************************** –4/6– TP no 2 (corrigé) ESIEE IGI-3005 2014-2015 Exercice 7. 10 001e nombre premier En écrivant les six premiers nombres premiers : 2, 3, 5, 7, 11 et 13, on peut constater que le 6e nombre premier est 13. Quel est le 10 001e nombre premier ? Corrigé *************************************************************************** 104743 Solution Maple (c’est de la triche ?) > ithprime(10001); 104743 *************************************************************************** Exercice 8. Plus grand produit dans une suite de chiffres Quel est le plus grand produit de cinq chiffres consécutifs dans ce nombre de mille chiffres ? 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450 Corrigé *************************************************************************** 40824 *************************************************************************** –5/6– ESIEE IGI-3005 TP no 2 (corrigé) 2014-2015 Exercice 9. Triplet pythagoricien de somme égale à 1 000 Un triplet pythagoricien est un ensemble de trois entiers naturels a < b < c tels que a2 + b2 = c2 Par exemple, 32 + 42 = 9 + 16 = 25 = 52 . Un seul triplet pythagoricien vérifie a + b + c = 1 000. Que vaut le produit abc ? Corrigé *************************************************************************** 31875000 *************************************************************************** Exercice 10. Somme de nombres premiers La somme des nombres premiers inférieurs à 10 vaut 2 + 3 + 5 + 7 = 17. Quelle est la somme de tous les nombres premiers inférieurs à deux millions ? Corrigé *************************************************************************** 142913828922 *************************************************************************** –6/6–