Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par C.Ret »

Pour occuper nos soirées de ce Week-End froid et hivernal je vous propose un petit exercice à réaliser selon notre tradition des Misez p'tit, Optimisez (en abrégé MPO)

Le sujet s'inspire d'un devoir de mathématique qu'un de mes gamins vient de rendre à son professeur.

Composer et optimiser un code pour votre calculatrice ou pocket préféré qui permette à partir de la saisie d'un entier quelconque supérieur ou égal à 10 d'afficher (ou imprimer) le Nombre de Keith immédiatement suivant.

Petit rappel:
----------------

Un nombre de Keith est un nombre entier K à n chiffres ayant la propriété suivante:
* En partant des n chiffres qui compose K, on détermine une sorte de suite de Fibonacci où chaque terme est composée à partir de la somme des n termes précédents.
* Si cette suite contient à un moment donné le nombre K, on dit que ce nombre est un nombre de Keith.

Par exemple 28 est un nombre de Keith.

En effet la suite générée par cet entier à deux chiffres est :
2, 8, 10 (=2+8), 18 (=8+10), 28 (=10+18) , 46 =(18+28), 74 ...
Comme 28 appartient à la suite qu'il génère, 28 est donc bien un nombre de Keith.


Le code que vous devez composer pour cet exercice prend comme argument dans la pile ou en sollicitant l'utilisateur un entier s'écrivant avec au moins deux chiffres (c'est à dire strictement supérieur à 9) et retourne en réponse le Nombre de Keith immédiatement suivant, voir ce même entier si celui-ci est effectivement un Nombre de Keith.
Le choix de la méthode de saisie de l'entier (pris dans la pile, prompt, lecture automatique aread ou input, ... ) est laissée au libre arbitre de l'auteur du code et il pourra ainsi correspondre à la méthode la plus adaptée aux spécificités de la machine. Il en est de même pour la méthode d'affichage ou d'impression du résultat.

L'idée sous-jacente étant cependant de pouvoir facilement déterminer une suite de nombres de Keith, un mécanisme simple de continuation vers la recherche du nombre suivant devra être prévu par une disposition simple (appuis sur la touche Run/Stop, ENTER etc... ) qui devra être précisée.

Afin de se faire une juste idée de l'efficacité des algorithmes utilisés, merci d'indiquer le temps approximatif mis par votre pocket préféré pour déterminer le nombre de Keith suivant immédiatement 70, 700 et 7000.

Si toute fois cela est possible - certaines machines très vétustes régulièrement évoquées sur ce forum pourrait avoir quelque difficulté à exprimer un résultat avant la saint-glinglin - pour 70000, 700000, 700000 etc...
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

C.Ret a écrit : Par exemple 28 est un nombre de Keith.

En effet la suite générée par cet entier à deux chiffres est :
2, 8, 10 (=2+8), 18 (=8+10), 28 (=10+18) , 46 =(18+28), 74 ...
Comme 28 appartient à la suite qu'il génère, 28 est donc bien un nombre de Keith.
...
Hummm comment tu fais si le premier nombre à trois chiffres ou plus ?

Par exemple avec 123, ca donne

1,2,3,5,8,13 etc . ?

Mais dans ce cas, 700 ferait

7,0,0,0,0.....ad eternam

Est ce bien cela ?
Modifié en dernier par Gilles59 le 22 févr. 2013 21:11, modifié 2 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par gege »

Bonjour,
Je ne comprends pas.
Quelle est la suite de Fibonacci associée à 124 ?
1, 2, 4... pas une suite de Fibonacci
1, 24, 25... mais pourquoi pas 12, 4, 16... ?
G.E.
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5217
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par bernouilli92 »

gege a écrit :Bonjour,
Je ne comprends pas.
Quelle est la suite de Fibonacci associée à 124 ?
1, 2, 4... pas une suite de Fibonacci
1, 24, 25... mais pourquoi pas 12, 4, 16... ?
G.E.
Ce n'est vraiment la suite de fibonacci mais c'est le même principe.
Pour 123, c'est :
1, 2, 3, 6, 11, 20, 37, 68, ...

Et pour 700, c'est :
7, 0, 0, 7, 7, 14, 28, etc...
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5217
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par bernouilli92 »

Voici ma première version, non optimisée, pour hp48 et suivantes.
Je pense qu'elle devrait également fonctionner sur hp28s.

Code : Tout sélectionner

<< DUP LOG IP 1 + -> N C 
  <<
    WHILE
      N C 1 - 1 
      FOR I
        I ALOG MOD LASTARG / IP SWAP
      -1 STEP 
      DO 
        C DUPN
        1 C 1 - START + NEXT
        C 1 + ROLL DROP
      UNTIL
        DUP N >=
      END
      C ROLLD
      C 1 - DROPN
      <>
    REPEAT
      1 'N' STO+
    END
    N
  >>
>>
Taille : 202,5 octets.

Le premier nombre de Keith supérieur à 700 est 742 et le premier supérieur à 7000 est 7385.
Le premier après 70000 est 86935.

Je ne l'ai encore fait tourner sur une vraie hp, mais j'imagine qu'il lui faudra beaucoup beaucoup de temps pour les valeurs > 70000.

D'après Wikipédia, il n'y a que 71 nombres de Keith inférieurs à 10e19.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

bernouilli92 a écrit :Voici ma première version, non optimisée, pour hp48 et suivantes.
Je pense qu'elle devrait également fonctionner sur hp28s.

[
Il semble qu'il manque qqe chose dans ton source.
La taille est différente et ca plante quand je lance ...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5217
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par bernouilli92 »

Je viens de vérifier, tout me semble bon.
Il fait bien sur remplacer certains caractères par leur équivalents hp :
<< et >> : debut et fin de prog
<> : signe different
>= : signe supérieur ou égal
-> : flèche

Mais tout cela tu le sais déjà.
Il y a aussi les erreurs de saisie du type : -1 au lieu de - 1

Je l'ai recopié à la main, j'ai pu me tromper quelque part, je vais vérifier à nouveau.
Modifié en dernier par bernouilli92 le 22 févr. 2013 23:13, modifié 1 fois.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Bonsoir à tous
Après avoir passé 2 semaines sur la 39gii, je suis content d'avoir retrouvé ma nSpire pour ce MPO.
(ha le clavier alpha direct, et ne pas avoir besoin de mettre ces pu..... de ; après chaque instruction) :D
Comme mes résultats sont en parfait accord avec ceux de Bernouilli92, je vous livre mon programme

Code : Tout sélectionner

Define keith(n)
Func
Local s,c,l,i,r,lnb
If n>9 then
Loop
0 sto>r
string(n) sto>s:dim(s) sto>l:l sto>c
NewList(l) sto> lnb
For i,1,l
expr(mid(s,i,1)) sto>lnb[i]
EndFor
While r<n
c+1 sto>c
sum(right(lnb,l)) sto>lnb[c]
lnb[c] sto>r
EndWhile
If r=n:Exit
n+1 sto>n
EndLoop
Else
string(n)&"<10"
EndIf
EndFunc
On appelle la fonction en transmettant n comme paramètre: keith(28) par exemple.
On obtient "n<10" si tel est le cas.
Pour n=70000, réponse en 7'05'' = 86935.
Pour optimiser,(le temps de calcul), il faudrait mémoriser les résultats, puisque tous les nombres compris entre 70000 et 86934 auront pour résultat 86935
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par C.Ret »

Gilles59 a écrit : Hummm comment tu fais si le premier nombre à trois chiffres ou plus ?

Par exemple avec 123, ca donne
Comme le signale très justemetn Bernouilli92, il faut utiliser à chaque fois autant de termes dans la somme qu'il y a de chiffres dans le nombre.

Ainsi, pour 123, la somme se fait à chaque pas avec les 3 derniers termes de la suite :

1 2 3 6 11 20 37 68 125 230 ...

Donc 123 n'est pas un nombre de Keith.

Pour 7000 on utilisera donc la somme des 4 derniers termes pour déterminer le terme suivant.
tyann a écrit : Pour n=70000, réponse en 7'05'' = 86935.
C'est pas mal, mais loin des performances de mon HP-28S qui affiche 86935 en moins de deux secondes en partant de 70000.

bernouilli92 a écrit :Voici ma première version, non optimisée, pour hp48 et suivantes. Je pense qu'elle devrait également fonctionner sur hp28s.[/code]

Effectivement elle devrait en ne modifiant que LASTARG par LAST sur HP-28S.

Ma première version était aussi fort proche de cette première version. Elle fait moins de 200 octets et met aussi un certain temps à trouver un résultat.


Mais j'ai un peu réflèchi et ma seconde version est une vraie bombe de 532 octets qui met moins de deux secondes pour trouver le nombre de Keith qui suit 7000000000 (c'est à dire 96189170155) et moins de trois secondes pour trouver le nombre de Keith suivant 70000000000 (c'est à dire 171570159070).
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Petite optimisation

Code : Tout sélectionner

Define keith(n)
Func
Local s,c,l,i,lnb
If n>9 then
Loop
string(n) sto>s:dim(s) sto>l:l sto>c
NewList(l) sto> lnb
For i,1,l
expr(mid(s,i,1)) sto>lnb[i]
EndFor
While lnb[c]<n
c+1 sto>c
sum(right(lnb,l)) sto>lnb[c]
EndWhile
If lnb[c]=n:Exit
n+1 sto>n
EndLoop
Else
string(n)&"<10"
EndIf
EndFunc
réponse pour n=70000 =6'09''
Bon sur ce, je vais me pieuter: bonne nuit à tous.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Bonjour à tous

Nouvelle optimistation

Code : Tout sélectionner

Define keith(n)
Func
Local s,c,l,lnb
If n>9 then
Loop
string(n) sto>s:dim(s) sto>l:l sto>c
seq(expr(mid(s,i,1)),i,1,l) sto>lnb
While lnb[c]<n
c+1 sto>c
sum(right(lnb,l)) sto>lnb[c]
EndWhile
If lnb[c]=n:Exit
n+1 sto>n
EndLoop
Else
string(n)&"<10"
EndIf
EndFunc
Nouveau temps pour 70000 = 5'26''
Trés loin des 2 secondes de C.ret, j'ose même essayer pour plus grand.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5217
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par bernouilli92 »

Gilles59 a écrit :
bernouilli92 a écrit :Voici ma première version, non optimisée, pour hp48 et suivantes.
Je pense qu'elle devrait également fonctionner sur hp28s.

[
Il semble qu'il manque qqe chose dans ton source.
La taille est différente et ca plante quand je lance ...
J'ai retappé le programme sur ma hp48gx, effectivement il y avait une erreur : il manquait un N juste avant le signe different.
Je viens de corriger le post précédent.
Au niveau des temps d'exécutions, sur 48gx :
Pour 700 : temps = 13 secondes
Pour 7000 : temps = 170 secondes

Voici une seconde version un peu plus courte :

Code : Tout sélectionner

<< DUP LOG IP 1 + -> C 
  <<
    WHILE
      DUP C 1 - 1 
      FOR I
        I ALOG MOD LASTARG / IP SWAP
      -1 STEP 
      DO 
        C DUPN
        1 C 1 - START + NEXT
        C 1 + ROLL DROP
      UNTIL
        DUP C 2 + PICK >=
      END
      C ROLLD
      C 1 - DROPN
      OVER <>
    REPEAT
      1 +
    END
  >>
>>

Taille : 187,5 octets
HP, Casio, Sharp, Psion, quelques TI et divers autres
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

C.Ret va falloir que tu publie ton programme magique parce que tes temps de réponses sont buffant ...

A moins que tu es programmé le tableaux des résultats précalculés ??
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par C.Ret »

bernouilli92 a écrit : [...]Voici une seconde version un peu plus courte :

Code : Tout sélectionner

<< DUP LOG IP 1 + -> C 
  <<
    WHILE
      DUP C 1 - 1 
      FOR I
        I ALOG MOD LASTARG / IP SWAP
      -1 STEP 
      DO 
        C DUPN
        1 C 1 - START + NEXT
        C 1 + ROLL DROP
      UNTIL
        DUP C 2 + PICK >=
      END
      C ROLLD
      C 1 - DROPN
      OVER <>
    REPEAT
      1 +
    END
  >>
>>
Taille : 187,5 octets
J'aime bien l'utilisation de la boucle WHILE/REPEAT, l'essentiel du code est dans la clause de test. C'est une bonne idée qui évite un appel récursif !

Ma première version ressemblait très fortement à celle ci (mais sans le WHILE/REPEAT) et en optimisant un peu la forme sous laquelle la variable donnant la dimension (le nombre de chiffre du nombre c'est à dire le nombre de termes à prendre en compte ) afin d'éviter les répétition de d 1 + ou d 1 - etc.

Pour comparaison et pour expliquer un peu l'algorithme, je donne ici une copie de ce code:

Code : Tout sélectionner

« DUP LOG IP -> n d                   // d est la 'dimension' de l'entier n
   « 
     0                                // initie somme des chiffres de n
     d 0 FOR i
        n i ALOG / IP 10 MOD          // place les chiffres de n dans la pile
        SWAP OVER +                   // fait la somme des chiffres
     -1 STEP

     DO
       DUP 2 *                        // calcule terme suivant
       d 3 + ROLL -
     UNTIL DUP n >= END               // jusqu'à atteindre ou dépasser n
     d 2 + ROLLD                      // sauvegarde dernier terme 
     d 1 + DROPN                      // efface les termes précèdants
     n
     IF DUP ROT =/=                   // test si n et dernier terme sont differents
     THEN 1 + NKEITH                  // alors cherche Keith Suivant pour (n+1)
     END
»  » 
'NKEITH' STO

182  octets.
28      <1"
70    0'02"
700   0'21"
7000  6'57"
70000  >1h

Comme d est définie au début du programme, je ne peux pas utiliser une boucle WHILE/REPEAT car sinon il y aurait une erreur si n change de dimension (passe de 2 à trois chiffres par exemple). L'appel récursif me paraissait la meilleure solution come cela d est définit pour chaque n.

Ce programme retourne un résultat à partir de 70000 après plus d'une heure sur HP-28S
C'est pour cela que je suis passé à une autre stratégie pour la version suivante.

A noter qu'avec ce nouvel algorithme, mon SHARP PC-1211 met exactement 11 secondes pour afficher 86935 après saisi 70000 et mon Hp-28S moins de deux secondes.

Gilles59 a écrit :C.Ret va falloir que tu publie ton programme magique parce que tes temps de réponses sont buffant ...

A moins que tu es programmé le tableaux des résultats précalculés ??
Je publierai tout cela ce soir, mais Gilles tu as deviné. Je m'y attendais d'ailleurs.

En effet, il n'y a que 71 Keith Numbers inférieur à 10^29 et donc beaucoup moins inférieur à 10^12 (qui est la limite du mon HP-28S) ou 10^10 (qui est la limite de mon SHARP PC-1211.

Un programme ayant tous ces nombres en mémoire est donc bien plus efficace. Inconvénient, il pèse une peu plus (563 octets sur HP_28S) et trois petites lignes de BASIC et une quarantaine de registres sur SHARP PC-1211 !


P.S.: Au fait, je n'ose pas publier une version pour HP-39gii, je m'attendais à une version provenant du lauréat du concours organisé par Mic sur CALC-BANK. Et oui, tu as maintenant une réputation à défendre :) Peut-être n'as tu pas encore reçu ton lot ?

En tout cas je profite de l'occasion pour te féliciter, ton jeu est très bien sur tous les plans, bien implémenté (il contourne les bugs et évite les pièges qu'ont tendus les concepteurs, bien programmé,bien à jouer ! 8) .
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par babaorhum »

Bonjour Tout le monde !

Après 3 semaines de boulot boulot + vacances (ca fait du bien), j'ai un peu de temps de jouer avec mes calculettes.

Et ... Chouette C.ret propose un super MPO ... nombre de Keith ... connais pas ...

C'est l'occase d'essayer mon "nouveau" TI-92, acheté une bouchée de pain sur la bay il y a 10 jours ... j'ai toujours voulu savoir ce que ca valait cette étrange machine (je suis plutôt de la génération 41) !

Je propose une version "calcul pur et dur" ... à comparer à celles de bernouilli92 donc !

On commence par la fonction "isKeith" qui me dit si c'est un Keith ou pas. J'utilise les listes du TI-92 et les fonctions associées dont "sum" qui donne directement la somme des termes de la liste, pratique !

Code : Tout sélectionner

:iskeith(nbre)
:Func
: Local mylist,i,k,l
: iPart(log(nbre))+1 -> k                    ' nombre de chiffres dans le nombre
: newList(k) -> mylist
: nbre -> l
:For i,k,1,-1
: fPart(l/10)*10 -> mylist[i]                 'on rempli la liste en décomposant le nombre, en commençant par les unités
: iPart(l/10) -> l
:EndFor
:Loop                                                'boucle principale 
: if mylist[k]>nbre then
:   return false
:   exit                                                'ce n'est pas un Keith
: Endif
: if mylisy[k]=nbre then
:   return true
:   exit                                                 'c'est un Keith !!
: Endif
: sum(mylist) -> l                                'somme de la liste
: shift(mylist,1) -> mylist                     'décalage d'un cran vers la gauche
: l -> mylist[k]                                     'incorporation nouveau terme dans la liste
:EndLoop
:EndFunc
et après c'est tout facile de faire le pgm qui correspond à l'énoncé de C.ret :

Code : Tout sélectionner

:FindKeith()
:Prgm
:local nn
:prompt nn
:if iskeith(nn) then
: Disp "Oui c'est un Keith !!!!"
:else
: Disp "Non ce n'est pas un Keith"
:EndIf
:Loop
: nn+1 -> nn
: if isKeith(nn)
: exit
:EndLoop
:Disp "Et le suivant est :"
:Disp nn
:EndPgm 
Pour les chronos je n'ai pas trouvé de fonctions de gestion du temps sur TI-92 :|

Je sors donc ma 41CX ... XEQ SW ... et je vous dirais un peu plus tard ... bon app !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Répondre

Retourner vers « Tous les Pockets »