caloubugs a écrit : => ça coûte beaucoup de temps CPU.
Ca c'est vrai. En plus sur le Commodore, un temps non négligeable est perdu si les variables alphanumériques ne sont pas à la fin de la plage mémoire. Pour cela, il faut faire attention à les définir dans le bon ordre.
Dans notre cas, N$ ne varie pas tout au long du programme, il faut la définir en premier, suivi de A$ qui ne "croît" qu'une fois à chaque boucle et enfin S$ qui croît moultes fois dans la boucle FOR/TO/NEXT
Voici donc une version avec laquelle je gagne pas mal de temps sur mon Commodore 8bits de MCMDXXXVII:
Code : Tout sélectionner
5 A%=0: B%=0: C%=0: L%=0: N%-1: P%=0: I=0 : REM ******* Initialisation des variables (en début de plage mémoire)
10 INPUT "N=";N$: A$=N$: S$=N$: L%=LEN(N$) : REM ******* Initialisation des chaines de caractère en fin de plage mémoire
15 DO : REM ******* Boucle principale
20 : N%=N%+1: A$=S$: C%=0: S$="": P%=N%
25 : FOR I=1 TO L% : REM **** Boucle Sommation/Detection Palindrome
30 : : A%=VAL(MID$(A$,I,1)): B%=VAL(MID$(A$,1+L%-I,1))
35 : : S%=C%+A%+B%: C%=S%/10: S$=CHR$(48+S%-10*C%)+S$ : REM C%=0 ou 1 si retenue
40 : : P%=P% AND (A%=B%) : REM P%=0 si A$ n'est pas palidromique
45 : NEXT I
50 : IF C% THEN S$="1"+S$: L%=L%+1
55 LOOP UNTIL P%
60 PRINT "Initial :";N$ : REM * * * Presentation resultat
65 PRINT "Iterations:";N%
70 PRINT "Palindrome:";A$
75 END
Je n'ai pas diminuer le nombre de variables, mais surtout le nombre de tests !
J'obtiens le palindrome de 10022000904998799523 en maintenant 9.7 minutes
Celui de 140669390 en 1.6 min
Mais en 'compressant' les p-codes:
Code : Tout sélectionner
1 a%=0:b%=0:c%=0:l%=0:n%-1:p%=0:i=0:input"N=";n$:a$=n$:s$=n$:l%=len(n$):do:n%=n%+1:a$=s$:s$="":p%=n%:fori=1tol%:a%=val(mid$(a$,i,1))
2 b%=val(mid$(a$,1+l%-i,1)):s%=a%+b%+c%:c%=s%/10:s$=chr$(48+s%-10*c%)+s$:p%=p%aand(a%=b%):next:ifc%thens$="1"+s$:l%=l%+1:c%=0
3 loopuntilp%:print"Initial :";n$:print"Itérations:";n%:print"Palindrome:";A$:end
Mais c'est bien moins lisible !!
Une version pour Hp-41C qui se limite au 10 chiffres de la machine.
Sur une 41C, je ne sais pas comment manipuler caractères par caractères l'affichage alpha.
Code : Tout sélectionner
t: z: y: x: L:
001 LBL "MPO57 abcde /abcde/ est le nombre inital (on n'est pas limité à 5 chiffres)
002 0 abcde 0 Initialise le compteur à t=0
003 X<> Y 0 abcde
004*LBL 00 t abcde *** Boucle Principale Inversion/Sommation
005 ENTER^ t abcde abcde Formatage du nombre
006 LOG t abcde n.nnnn
007 INT t abcde n
008 ALOG t abcde 10^n
009 / t a.bcde
010 0 t a.bcde 0 Initialisation de l'inversion
011 RCL Y t a.bcde 0 a.bcde x: contient les chiffres à ajouter
012*LBL 01 t a.bcde .ba c.de *** Boucle Secondaire: inversion du nombre
013 INT t a.bcde .ba c c.de
014 ST+ Y t a.bcde c.ba c c.de
015 X<> L t a.bcde c.ba c.de c
016 FRC t a.bcde c.ba .de c.de
017 R^ a.bcde c.ba .de t c.de
018 X<> L a.bcde c.ba .de c.de t le compteur est sauvegadé dans le registre L:
019 Clx a.bcde c.ba .de 0 t
020 10 a.bcde c.ba .de 10 t
021 ST/ Z a.bcde .cba .de 10 t
022 ST* Y a.bcde .cba d.e 10 t
023 X<> L a.bcde .cba d.e t 10 la valeur 10 du registre L: sera utilisée plus loin
024 RDN t a.bcde .cba d.e 10
025 x>0 ? On boucle tant qu'il reste des chiffres à ajouter pour l'inversion
026 GTO 01 t a.bcde .edcba 0 10
027 X<> L t a.bcde .edcba 10 0
028 * t a.bcde e.dcba 10
029 X=Y ?
030 GTO 02 Sortie de la boucle principale si le nombre est un palindrome
031 + t s.ssss *** Sommation du nombre et de son inversion
032 ISG Y t+1 s.ssss incrémente le compteur
033 AVIEW
034 GTO 00
035*LBL 02 t a.bcba a.bcba 10 *** Fin du programme
036 RDN t a.bcba la touche x<>y permet d'afficher alternativemetn le palindrome
037 .END. final et le compteur
t p
Soit en version 'condensée' :
Code : Tout sélectionner
001*LBL "MPO57
0 x<>y
004*LBL 00
ENTER^ LOG INT 10^x / 0 RCL Y
012*LBL 01
INT ST+ Y X<> L FRC R^ X<> L Clx 10
ST/ Z ST* Y X<> L RDN x>0 ? GTO 01
X<> L * X=Y ? GTO 02
+ ISG Y AVIEW
GTO 00
035*LBL 02
RDN
037 .END.