TP2 Dix problèmes du Projet Euler - FR

publicité
TP no 2 (corrigé)
ESIEE IGI-3005
2016-2017
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;
}
–1/6–
ESIEE IGI-3005
TP no 2 (corrigé)
2016-2017
}
return s;
}
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é)
2016-2017
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 ;
for (a = 0; a < maxi; ++a) {
–3/6–
ESIEE IGI-3005
TP no 2 (corrigé)
2016-2017
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)
***************************************************************************
–4/6–
TP no 2 (corrigé)
ESIEE IGI-3005
2016-2017
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
***************************************************************************
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
e
6 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 ?
–5/6–
ESIEE IGI-3005
TP no 2 (corrigé)
2016-2017
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
Corrigé
***************************************************************************
40824
***************************************************************************
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–
Téléchargement