Bonjour.
Bon, ben voilà je m'en doutais, ça devait arriver
On peut résoudre le problème sans exécuter la moindre boucle ni même allumer une calculatrice
Donc on part de l'extraordinaire algorithme de dprtl, sur mon fidèle destrier la TI89 :
Code : Tout sélectionner
-----VERSION "BRUTALE"
nbpieces()
Func
Local a,b,c,d,e,f,n
0->n
For a,0,100,100
For b,a,100,50
For c,b,100,20
For d,c,100,10
For e,d,100,5
For f,e,100,2
n+1->n
EndFor
EndFor
EndFor
EndFor
EndFor
EndFor
Return n
EndFunc
On applique la méthode du 51 pour éliminer la boucle des pièces de 2, et on peut aussi éliminer la boucle des euros en s'apercevant que lorsque b vaut 100 on ajoute en fait 1 au compteur, et que cela arrive dans deux cas : (a=0 et b=100) ou (a=100 et b=100).
Le programme devient :
Code : Tout sélectionner
-----VERSION AFFINEE
nbpieces()
Func
Local a,b,c,d,e,f,n
2->n
For b,0,50,50
For c,b,100,20
For d,c,100,10
For e,d,100,5
n+51-(e+mod(e,2))/2->n
EndFor
EndFor
EndFor
EndFor
Return n
EndFunc
En fait on peut éliminer aussi la boucle des pièces de 5 pour une raison... euh en fait d est toujours divisible par 10, donc e va toujours de 5 en 5 et tombe sur 100 à la fin (ok c'est vaseux mais je ne sais pas comment bien l'expliquer). A noter que la divisibilité de d par 10 est importante et que si "plus haut" on avait utilisé par exemple une pièce de 25 ou de 75, ben faut recalculer le truc.
On obtient ceci :
Code : Tout sélectionner
-----VERSION LEVEL 1
nbpieces()
Func
Local b,c,d,n
2->n
For b,0,50,50
For c,b,100,20
For d,c,100,10
n+d^2/20-52*d/5+541->n
EndFor
EndFor
EndFor
Return n
EndFunc
Bon, on peut aussi virer la boucle des pièces de 10 hop :
Code : Tout sélectionner
-----VERSION LEVEL 2
nbpieces()
Func
Local b,c,n
2->n
For b,0,50,50
For c,b,100,20
n+2156-3563/60*c+109/200*c^2-c^3/600->n
EndFor
EndFor
Return n
EndFunc
Et là je fatigue, mais il est clair qu'on peut continuer, cependant la boucle de 20 est plus difficile à condenser parce que la variable b varie par pas de 50, qui n'est pas divisible par 20, donc c peut ou pas atteindre 100 et il faut distinguer deux cas. Bref, c'est mer..que, mais pas techniquement compliqué.
Alors chers zauditeurs, on arrive à quoi ?
Eh bien au fameux "programme à Momo" dont je vous livre la version adaptée au problème :
Eh oui, dans tout problème sauf difficulté technique (c'est très fréquent en fait), on peut soit allumer la machine sans réfléchir du tout, soit tout résoudre théoriquement et donner la solution sur papier, ou adopter un moyen terme entre les deux. Il est un peu déprimant le programme à Momo, non ?
Je préfère vos solutions !!
Sayonara
G.E.