ESIEE IGI-3005 TP no2 (corrigé) 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éma-
tiques 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 pro-
blè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 pro-
blèmes résolus) vous permettra de juger votre progression et des récompenses vous
seront accores 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 3ou de 5, on
obtient 3,5,6et 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 no2 (corrigé) 2016-2017
}
return s;
}
Puis on peut remarquer que les multiples de 3inférieurs à nsont de la forme 3kavec 0k <
E(n/3) et donc que le somme des multiples de 3inférieurs à npeut s’écrire Pk=E(n1
3)
k=0 3k, soit
3Pk=E(n1
3)
k=0 k, soit encore 3(E(n1
3)+1)E(n1
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 1et 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 no2 (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,1=ETl,1
10 et Tl+1,2= 10 Tl,2+Tl,1mod 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 no2 (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 bpeut partir de a(on ira près de deux fois plus vite)
2. on peut inverser les deux composantes du test (vérifier si pest 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 6chiffres
est forcément multiple de 11 et donc que apar exemple est un multiple de 11 (il faudra que
breparte de 0)
***************************************************************************
–4/6–
ESIEE IGI-3005 TP no2 (corrigé) 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 001enombre premier
En écrivant les six premiers nombres premiers : 2,3,5,7,11 et 13, on peut constater que le
6enombre premier est 13.
Quel est le 10 001enombre 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–
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !