Nombre serpent
Le cadre
On dira d'un entier qu'il serpente si ses chiffres alternent entre croissants et décroissants quand on les lit. Par exemple :
- \(8\), \(90\), \(243\,516\) et \(31\,524\) sont des nombres serpent ;
- \(44\), \(123\) et \(4235\) ne sont pas des nombres serpent.
- Objectif
- Compter les nombres serpent qui ont \(n\) chiffres.
Les zéros de tête sont interdits (sauf pour zéro lui-même) pour les nombres, ainsi \(08\) ne compte pas comme un autre nombre serpent.
Exemples
- Les nombres serpent à 0 chiffre n'existent pas. Il n'y en a aucun ; 0.
- Les nombres serpent à 1 chiffre sont \(0\), \(1\), \(2\), \(\cdots\), \(8\), et \(9\). Il y en a 10.
- Parmi les nombres serpent à 2 chiffres, il y a \(10\), \(12\), \(13\), ..., \(20\), \(21\), \(23\), ..., \(98\). Il y en a 81 : de \(10\) inclus à \(100\) exclu, il y en a 90, auquel on enlève les 9 nombres \(11\), \(22\), ..., \(99\) qui ne sont pas serpent.
- Parmi les nombres serpent à 3 chiffres, il y a \(101\), \(121\), \(120\), ..., \(205\), \(218\), \(230\), ..., \(989\). Il y en a 525.
Exercice
Coder une fonction serpent qui prend un entier positif en argument et qui renvoie l'effectif des nombres serpent à n chiffres.
On pourra utiliser de la mémoïsation pour stoker des résultats intermédiaires.
Indice 1
Si on sait que :
- Il y a \(a\) nombres serpent de taille 20 qui finissent par
0en décroissant. - Il y a \(b\) nombres serpent de taille 20 qui finissent par
1en décroissant. - Il y a \(c\) nombres serpent de taille 20 qui finissent par
2en décroissant. - Il y a \(d\) nombres serpent de taille 20 qui finissent par
3en décroissant. - Il y a \(e\) nombres serpent de taille 20 qui finissent par
0en croissant. - Il y a \(f\) nombres serpent de taille 20 qui finissent par
1en croissant. - Il y a \(g\) nombres serpent de taille 20 qui finissent par
2en croissant. - Il y a \(h\) nombres serpent de taille 20 qui finissent par
3en croissant.
Pouvez-vous déduire la quantité de nombres serpent à 21 chiffres qui finissent par 3 en croissant ?
Solution
Il s'agit de \(a+b+c\). En effet, s'il finit par 3 en croissant, c'est qu'avant, c'était 0, 1 ou 2, qu'il était de taille 20 et qu'il finissait en décroissant.
Indice 2
Généraliser une formule qui donne, pour \(n>1\) :
- l'effectif des nombres serpent de taille \(n\) qui finissent par
ien décroissant ; - l'effectif des nombres serpent de taille \(n\) qui finissent par
ien croissant.
Tout cela en fonction des effectifs pour ceux de taille \(n - 1\).
Indice 3
On utilisera deux tableaux pour progresser en dynamique :
serpent_croissantde longueur 10, qui indique pour chaque chiffreide 0 à 9, combien de nombres serpent à \(n\) chiffres se finissent parien croissant.serpent_decroissantde longueur 10, qui indique pour chaque chiffreide 0 à 9, combien de nombres serpent à \(n\) chiffres se finissent parien decroissant.
Écrire les instructions qui permettent :
- de construire deux nouveaux tableaux
serpent_croissant_suivantetserpent_decroissant_suivantqui contiennent les effectifs suivants en fonction des précédents. - de remplacer des deux anciens tableaux par les nouveaux.
Indice 4
Écrire l'instruction simple qui calcule et stocke la bonne valeur de serpent[n] en fonction de serpent_croissant et serpent_decroissant.
Indice 5
Initialiser correctement toutes vos variables et mettre en place la boucle qui fait progresser votre problème ; on parle de programmation dynamique.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)