Nombres auto-digitaux
(idée honteusement volée dans "le virus informatique", mais en même temps, il serait dommage de laisser cette idée tomber dans les limbes de l'oubli sous prétexte que ce bon journal n'existe plus).
On dira d'un nombre qu'il est autodigital parfait s'il peut être calculé en utilisant tous les chiffres qui le compose dans leur ordre d'apparition (de gauche à droite). Si l'ordre d'apparition n'est pas respecté, on le dira imparfait. Un exemple valant mieux qu'un long discours :
- 36 = 3! * 6
- 127 = -1 + 27
- 660 = 6! - 60
Ces trois nombres sont des autodigitaux parfaits. Le dernier nombre met en évidence qu'on accepte aussi, arbitrairement, d'utiliser des groupes de chiffres. Attention, on n'accepte pas d'utiliser le groupe formé de tous les chiffres, i.e. le nombre recherché lui-même, car cela manquerait un peu d'intérêt de constater que, par exemple, 660 = 660, non ? Le deuxième exemple montre que l'opérateur de soustraction peut-être utilisé comme opérateur unaire (s'appliquant à une seule opérande), ce qui revient à dire qu'on accepte les nombres négatifs. Dans le cadre de ce problème, on se limitera aux opérateurs suivant (que l'on pourra combiner autant que nécessaire) :
- les quatres opérations de base : +, -, /, * (on accepte le "-" comme opérateur et comme signe)
- l'élévation à la puissance : ^
- la factorielle : ! [qui se définit par 0! = 1 ; 1! = 1 ; n! = 1 * 2 * ... * n (pour n > 1)
- la racine carrée
- les parenthèses : ( )
La question est bien évidement de trouver tous les nombres autodigitaux parfaits ou non entre 0 et ... ben, jusqu'où vous pouvez. Personellement, j'ai aussi fait quelques recherches...
tranche | # parfaits | # imparfaits |
0-999 | 39 | 29 |
1000-1999 | 36 | 127 |
Si vous vous ennuyez, vous pouvez ajouter d'autres opérations, telles que la sommielle (pendant de la factorielle pour l'addition), ou le changement de base.
Indice: Pour faire ce projet en C, manipuler des pointeurs sur fonction peut aider. D'autres langages (comme CAML) me semblent plus simple, mais ça peut être personnel.
Ce problème a été assez intensivement étudié par un mathématicien américan nommé Erich Friedman. À la lecture de sa page web, j'aime bien cette personne et je vous conseille d'aller lui rendre visite. Sa collection de puzzles est très intéressante pour qui veut faire de petits défis de programmation.