Le site apprendre-en-ligne.net propose 256 énigmes mathématiques à résoudre à l’aide d’un programme informatique. Les solutions ne sont pas données mais il est possible de valider ses résultats après inscription sur le site. Il s’agit du défi Turing que vous retrouverez ici : https://www.apprendre-en-ligne.net/turing/index.php
Les énoncés des problèmes sont reproduits ci-dessous avec une proposition de solution sous forme d'algorithme codé en Basic LibreOffice, Delphi et Python 3.
Si on liste tous les entiers naturels inférieurs à 20 qui sont multiples de 5 ou de 7, on obtient 5, 7, 10, 14 et 15. La somme de ces nombres est 51.
Trouvez la somme de tous les multiples de 5 ou de 7 inférieurs à 2013.
Les multiples de 35 sont multiples de 5 et de 7. Selon l'algorithme choisi, il faudra éviter de les prendre en compte deux fois.
A la place de l'algorithme ci-dessous, on aurait pu utiliser la formule de la somme des n premiers termes d'une suite arithmétique.
Faire la somme de tous les multiples de 5, de 5 à 2012.
Faire la somme de tous les multiples de 7, de 7 à 2012.
Faire la somme de tous les multiples de 35, de 35 à 2012.
La solution est : somme des multiples de 5 + somme des multiples de 7 - somme des multiples de 35.
sub probleme_001(m1 as long,m2 as long,limite as long,resultat as long)
'resultat retourne la somme des multiples de m1 ou m2 dans l'intervalle [1;limite].
'm1 et m2 doivent être des nombres premiers.
dim i as long
dim m3 as long
dim s1 as long
dim s2 as long
dim s3 as long
m3=m1*m2
for i=m1 to limite step m1
s1=s1+i
next i
for i=m2 to limite step m2
s2=s2+i
next i
for i=m3 to limite step m3
s3=s3+i
next i
resultat=s1+s2-s3
end sub
Chaque nouveau terme de la suite de Fibonacci est généré en ajoutant les deux termes précédents. En commençant avec 1 et 1, les 10 premiers termes sont les suivants : 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
En prenant en compte les termes de la suite de Fibonacci dont les valeurs ne dépassent pas 4 millions, trouver la somme des termes impairs.
Un nombre entier est pair si le reste de la division par 2 vaut 0, c'est à dire si nombre modulo 2 = 0.
Initialiser la valeur du premier terme de la suite de fibonacci à 1.
Initialiser la valeur du précédent terme de la suite de fibonacci à 0.
Répéter :
Si la valeur du terme est impaires, l'additionner dans un compteur.
Conserveur la valeur du terme actuel en tant que valeur précédente.
Calculer la valeur du terme suivant.
Jusqu'à ce que la valeur soit supérieure à la limite.
La solution est la valeur du compteur au sortir de la boucle.
sub probleme_002(limite as long,resultat as long)
'resultat retourne la somme des termes impairs de la suite de Fibonacci dans l'intervalle [1;limite].
dim aux as long
dim nombre as long
dim precedent as long
nombre=1
precedent=0
resultat=0
if limite>0 then
do
if (nombre mod 2)>0 then resultat=resultat+nombre
aux=precedent
precedent=nombre
nombre=nombre+aux
loop until nombre>limite
end if
end sub
Les facteurs premiers du nombre 2013 sont 3, 11 et 61 car 3x11x61=2013.
Quel est le plus grand facteur premier du nombre 20130101 ?
Pour trouver le plus grand facteur premier d'un nombre entier positif, il faut décomposer ce nombre en nombres premiers.
Cette décomposition se fait en partant du plus petit nombre premier comme diviseur, c'est à dire 2. Il s'agit de procéder à des divisions euclidiennes successives donnant un reste à 0. Tant que le quotient obtenu est divisible par le nombre premier, on poursuit. Sinon on passe au nombre premier immédiatement supérieur. Le plus grand facteur premier est trouvé (il s'agit du dernier diviseur) lorsque le quotient vaut 1.
L'algorithme est optimisé en prenant en compte les deux particularités suivantes :
Répéter :
Rechercher le plus petit nombre premier diviseur du nombre tel que nombre modulo nombre premier = 0.
nombre ← nombre / nombre premier.
Jusqu'à ce que le quotient de la division euclidienne vaille 1.
La solution est le dernier nombre premier diviseur de nombre.
sub probleme_003(ByVal nombre as long,resultat as long)
'resultat retourne le plus grand facteur premier d'un nombre positif
dim aux as long
dim diviseur as long
dim limite as long
if nombre>1 then
do
'-> Début de la recherche du plus petit nombre premier diviseur de nombre
diviseur=0
if (nombre mod 2)=0 then diviseur=2 else if (nombre mod 3)=0 then diviseur=3
if diviseur=0 then
aux=3
limite=int(sqr(nombre))
while (diviseur=0) and (aux<limite)
aux=aux+2
if (nombre mod aux)=0 then diviseur=aux
wend
end if
'<- Fin de la recherche
if diviseur=0 then diviseur=nombre 'Nombre est premier car aucun diviseur trouvé
nombre=nombre/diviseur
loop until nombre=1 'Boucle tant qu'il reste un diviseur autre que 1
resultat=diviseur
end if
end sub