Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Compter le nombre de 0 qui terminent un (très grand) nombre

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Aster



Inscrit le: 11 Nov 2006
Messages: 4

MessagePosté le: 11 Nov 2006 12:37    Sujet du message: Compter le nombre de 0 qui terminent un (très grand) nombre Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 11 Nov 2006 13:17    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Aster



Inscrit le: 11 Nov 2006
Messages: 4

MessagePosté le: 11 Nov 2006 14:48    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Aster



Inscrit le: 11 Nov 2006
Messages: 4

MessagePosté le: 11 Nov 2006 23:04    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 12 Nov 2006 9:27    Sujet du message: Répondre en citant

Bonjour,
J'ai déjà répondu à un étudiant qui avait les mêmes questions que vous ici
http://alamanya.free.fr/forum/viewtopic.php?t=868.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Aster



Inscrit le: 11 Nov 2006
Messages: 4

MessagePosté le: 12 Nov 2006 14:18    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 12 Nov 2006 17:21    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.