Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Aster
Inscrit le: 11 Nov 2006 Messages: 4
|
Posté le: 11 Nov 2006 12:37 Sujet du message: Compter le nombre de 0 qui terminent un (très grand) nombre |
|
|
J'ai pense à ca comme procédure mais j'ai pas encore pu tester(j'ai pas encore maple chez moi):
> div:=proc(x)
local y, compt;
y:=x;
compt:=0;
while type(y,posint) do y:=y/10 and compt:=compt +1 end do;
end proc;
return compt;
>div(5000!);
Pour Compter le nombre de 0 qui terminent factoriel 5000 |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 11 Nov 2006 13:17 Sujet du message: |
|
|
Bonjour, je corrige quelque peu votre procédure, mais l'idée générale était comprise:
Code: |
> div:=proc(x::nonnegint)
> local y, compt;
> if x=0 then return 1 end if;
> y:=x;
> compt:=0;
> while type(y,posint) do y:=y/10: compt:=compt+1 end do;
> return compt-1;
> end proc;
> div(0);
1
> div(1000);
3
> div(50!);
12
> div(5000!);
1249
|
|
|
Revenir en haut de page |
|
 |
Aster
Inscrit le: 11 Nov 2006 Messages: 4
|
Posté le: 11 Nov 2006 14:48 Sujet du message: |
|
|
merci beaucoup!! je pense que j'aurais compris l'erreur du compt -1 en testant sur maple... Mais le cas 0 je l'avais oublié! Il n'y a pas un type pour les nombres entiers tout cour? Sans etre obliger de séparer les cas positif et negatif?
Merci encore
Aster
Dernière édition par Aster le 12 Nov 2006 19:40; édité 2 fois |
|
Revenir en haut de page |
|
 |
Aster
Inscrit le: 11 Nov 2006 Messages: 4
|
Posté le: 11 Nov 2006 23:04 Sujet du message: |
|
|
Alors d'après ma prof cette procédure ne marche pas pour des nombres trop gros du genre 500 000! ca ne marchera pas... Je vois pas comment on peut partir autrement... Y-a-t il une fonction de maple permettant de decomposer un nombre en une liste de chiffre qui le composent (par exmple pour 500510 on aurait [5,0,0,5,1,0] )?
Mais je pense que la aussi sur un nombre trop gros on est bloqué... |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
|
Revenir en haut de page |
|
 |
Aster
Inscrit le: 11 Nov 2006 Messages: 4
|
Posté le: 12 Nov 2006 14:18 Sujet du message: |
|
|
sur des trop gros chiffre cette procédure fait planter l'ordinateur et même sur factoriel 5000! elle est beaucoup plus longue que celle que vous m'aviez corrigé...
J'ai essayez ca mais j'ai un problème quelque part :
> div:=proc(x::nonnegint)
local y, compt;
if x=0 then return 1 end if;
y:=x;
compt:=0;
while type(y,posint) do y:=y/10: compt:=compt+1 end do;
return compt-1;
end proc:
> div(5000!);
1249
> dive:=proc(x::nonnegint)
local y, compt;
if x=0 then return 1 end if;
if x=5000! then return 1249 end if;
y:=x;
compt:=0;
while type(y,posint) and y>5000! do y:=y/10^1249:
compt:=compt+1249 end do;
while type(y,posint) and y<5000! do y:=y/10: compt:=compt+1 end do;
return compt-1;
end proc:
> dive(10000!);
3746
> div(10000!);
2499
j'ai donc rajouter la ligne
compt:=compt-1247
et je trouve alors le même resultat avec les deux procedures pour factoriel 10000.
Mais pour factoriel 50000 j'ai 12491 avec dive et 12499 avec div...
Je vois pas vraiment comment je dois modifier mes boucles ou mon compteur (compt)...
Merci d'avance à ceux qui m'aideront.
Aster |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 12 Nov 2006 17:21 Sujet du message: |
|
|
Bonjour, je ne vois pas l'intérêt de faire cette bidouille, car de toutes façons la procédure prendra du temps pour de grands nombres, à moins peut être d'utiliser la condition while y mod 10=0, ce qui est très rapide, la fonction mod bénéficiant de l'efficacité de la librairie GMP.
Voir GMP dans l'aide.
Code: |
> div:=proc(x::nonnegint)
> local y, compt;
> if x=0 then return 1 end if;
> y:=x;
> compt:=0;
> while y mod 10=0 do y:=y/10: compt:=compt+1 end do;
> return compt;
> end proc:
> t:=time(): div(5000!); time()-t;
1249
0.188
|
0.188 seconde pour calculer div(5000!) sur un AMD 64 à 3,6 GHz de fréquence d'horloge.
A+ |
|
Revenir en haut de page |
|
 |
|