Pascal
zigzagart
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je voudrais savoir comment on peut connaitre le nombre de chiffres que compose un entier
dans le programme pascal
merci
<config>Windows 7 / Safari 535.7</config>
je voudrais savoir comment on peut connaitre le nombre de chiffres que compose un entier
dans le programme pascal
merci
<config>Windows 7 / Safari 535.7</config>
4 réponses
-
Le moyen le plus pratique est de calculer les chiffres qui composent le nombre dans la base de ton choix, décimal je suppose, en les comptant :
Nb_Chiffres:= 0; While Valeur > 0 do begin Valeur:= Valeur div 10; Inc(Nb_Chiffres); end; -
Un peu de maths et c'est bon...
function nbChiffres(const n:integer):integer; begin result:=1+round(ln(abs(n))/ln(10)); end; -
Ha oui ! C'est vrai que c'est pas mal !
Et après quelques tests, j'ai pu remarquer que la rapiditée d'exécution s'équilibre dès que l'on monte dans le nombre de chiffres en présence.
Seul petit bémol : le code asm est un peu plus encombrant (*2)...-
-
Si si c'est bien ce que j'appelle le code asm, le code assembleur en fait, et j'obtiens 32 octets de différence...Pour 29 octets pour le While ! Mais c'est sous delphi, et sa notion d'optimisation est on ne peut plus approximative malgré les réglages, et il faut croire que Dev-Pascal fait beaucoup mieux, ce qui est plutôt rassurant !
- On n'a peut-être pas testé tout à fait le même code, j'avais transformé le tien en fonction pour coller au mien :
function Nb_Chiffres(Valeur:integer):integer; begin Nb_Chiffres:= 0; While Valeur > 0 do begin Valeur:= Valeur div 10; Inc(Nb_Chiffres); end; end;
Mais bon pour 32 octets de différence...
-
Oui, je te l'accorde !
Et puis ta solution tiens compte des nombre négatifs, ce qui équilibre un peu la différence de taille.
De toute manière, malgré que je ne suis pas très fan du FPU, trop souvent plus lent, la solution Ln est attractive, et je pense déjà à quelques anciennes routines ou elle pourrait être améliorative... Donc, merci !
-
-
On peut aussi convertir l'entier en chaine et obtenir sa longueur.
Length(IntToStr(Valeur))
Dal-
-
Ah, les entiers négatifs.
Dans ton code, tu retournes 0 si Valeur := -12345, ce qui me parait inexact. Il y a bien 5 chiffres dans cet entier.
Pour prendre en compte ce cas dans ma proposition, on peut ajouter un test. Si Valeur < 0, on retire 1 à la longueur obtenue.
Nb_Chiffres := Length(IntToStr(Valeur)); if Valeur < 0 then Dec(Nb_Chiffres);
Cela fait tout de même un code plus simple et avec nettement moins de calculs :-D
Enfin, on peut toujours améliorer.
Dal -
C'est le code de nicocorico qui renvoit 0 si le nombre est inférieur à 0.
Dans le mien les nombres négatifs sont pris en compte avec l'appel de la fonction abs.
Le seul cas qui bug, c'est n=0, mais avec un petit if ça se règle vite.
Par contre avec le recul, round ne convient pas du tout, c'est plutôt trunc qu'il faut prendre ici :
1+trunc(ln(abs(n))/ln(10));
-
-