Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Syracuse ou Collatz (53 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Fl0D Ecrit le: Dimanche 13 mars 2005 à 14:01 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Bonjour,

Je programme en TIGCC et mon programme marche mais il ya un petit hic. Tout d'abord j'énonce l'algorithme :
L'algorithme de Collatz provient du fameux problème de Syracuse, et s'énonce ainsi :
Choisir un entier naturel N :
S'il est différent de 1, alors
S'il est impair,
Remplacer N par 3N+1;
S'il est pair,
Remplacer N parN/2;
Si N=1,
Arreter.

Exemple : Prenons le nombre 5. Ce dernier est impair je fais 3*5+1=16. Ce dernier est pair je fais 16/2=8. De même 8/2=4, 4/2=2,2/2=1. Je trouve 1 je m'arrête...
Après plusieurs essais (vérifiables très rapidement en programmation - exemple ici) on aboutit à une remarque, c'est ainsi que se termine la conjecture de Syracuse :"
L'algorithme de Collatz finit toujours par le
cycle 4,2,1; quelque soit l'entier N choisi.


Eh bien mon prog marche bien, voici son code :
#define USE_TI89
#define MIN_AMS 100
#include <tigcclib.h>

void _main(void)
{
clrscr();
long a;
long n;
printf ("Entrez un nombre entier : \n");
scanf("%ld", &a);
n = 0;
FontSetSys(0);
while(a > 1)
{
if (fmod(a,2) == 0)
{
a = a/2;
}
else
{
a = 3*a+1;
}

printf("\n%ld", a);
n++;
}

printf("\n[Etapes] : %ld\n", n);
ST_helpMsg("Programmé par FloD (flod@laposte.net)");
if (ngetchx()==KEY_ENTER)
return;
}


Mais je ne peux pas saisir de valeurs très importantes qui demande plus de 500 étapes par exemples... :(
De plus je me demande s'il est possible facilement d'intégrer les puissances en entrée sur TIGCC comme mettre : 10^21 (c'est un peu lourd de taper 21 zéros à la suite).

Merci d'avance
Programmeur : Ma page
    
./Post n°1   Marquer comme non lu.
Kevin Kofler Ecrit le: Dimanche 13 mars 2005 à 14:32 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Déjà, pourquoi utilises-tu fmod??? Remplace fmod(a,2) par a%2.
Et ensuite un long est limité à 2^31-1. Si tu veux de la précision arbitraire (enfin, pas tout à fait arbitraire non plus, ça va jusqu'à 2^1024-1), il faut travailler avec estack.h.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°2   Marquer comme non lu.
limmt Ecrit le: Dimanche 13 mars 2005 à 20:07 Déconnecté(e)    Voir le profil de limmt Envoyer un email à limmt Visiter le site WEB de limmt Envoyer un message privé à limmt  


a=a/2;

c'est lent ca, utilise plutot a>>=1; qui sera beaucoup plus rapide ;)
http://www.falco-fr.com/ - http://www.jump67.com/ - http://www.msf-league.com/
    
./Post n°3   Marquer comme non lu.
Sasume Ecrit le: Dimanche 13 mars 2005 à 22:05 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Je pense que tigcc optimise de lui-même
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 14 mars 2005 à 01:36 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Il optimise, mais pas en a>>1, mais en un truc un peu plus compliqué, parce que ce sont des nombres signés, et que >> et / arrondissent différemment si a est négatif.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
Fl0D Ecrit le: Mardi 15 mars 2005 à 14:06 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Ok merci c'est noté pour le modulo % et a>>=1. (c'était vieux ^^)
Sinon vous voyez mon problème ? A un moment où le nombre demande beaucoup d'étapes ça ne marche pas. Y'aurait-il une solution à ce problème ? merci.
Programmeur : Ma page
    
./Post n°6   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 15 mars 2005 à 18:12 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


C'est parce que tes nombres ne rentrent pas dans un long.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°7   Marquer comme non lu.
Fl0D Ecrit le: Mercredi 16 mars 2005 à 16:12 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Oui justement, je savais que c'était le problème. long n'est pas assez "fort" alors que je veux rentrer des nombres super importants. Mais comment faire...
Programmeur : Ma page
    
./Post n°8   Marquer comme non lu.
Jfg Ecrit le: Mercredi 16 mars 2005 à 18:13 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


long long
Kill Mario
    
./Post n°9   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 16 mars 2005 à 20:59 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


estack.h
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°10   Marquer comme non lu.
Fl0D Ecrit le: Dimanche 20 mars 2005 à 20:11 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Merci bien mais là je comprends pas trop
je fais #include <estack.h> et après ?
Je remplace long par long long ???

Là je vois vraiment pas comment faire pour avoir un truc plus "fort" que long.
Programmeur : Ma page
    
./Post n°11   Marquer comme non lu.
Kevin Kofler Ecrit le: Dimanche 20 mars 2005 à 20:13 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


http://tigcc.ticalc.org/doc/estack.html. Et lis bien toute la doc, ça fonctionne de manière complètement différente qu'un simple long.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°12   Marquer comme non lu.
Kevin Kofler Ecrit le: Dimanche 20 mars 2005 à 20:29 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Voilà à quoi ça ressemblerait:
#define USE_TI89
#define MIN_AMS 202
#include <tigcclib.h>

void _main(void)
{
clrscr();
char buffer[616];
ESI a;
ESI n;
HANDLE handle;
printf ("Entrez un nombre entier : \n");
getsn(buffer, 615);
push_parse_text(buffer);
a = top_estack;
push0();
n = top_estack;
FontSetSys(0);
while(({push_less_than((ESI[]){1,1,POSINT_TAG}+2,a);*top_estack==TRUE_TAG;}))
{
if (({push_mod(a,(ESI[]){2,1,POSINT_TAG}+2); is0(top_estack);}))
{
push_integer_quotient(a,(ESI[]){2,1,POSINT_TAG}+2); a = top_estack;
}
else
{
push_product((ESI[]){3,1,POSINT_TAG}+2,a); push_sum(top_estack,(ESI[]){1,1,POSINT_TAG}+2); a = top_estack;
}

handle = display_statements (a, 1, 1);
printf("\n%s", HeapDeref (handle));
HeapFree (handle);

push_arg_plus_1(n); n = top_estack;
}

handle = display_statements (n, 1, 1);
printf("\n[Etapes] : %s\n", HeapDeref (handle));
HeapFree (handle);

ST_helpMsg("Programmé par FloD (flod@laposte.net)");
if (ngetchx()==KEY_ENTER)
return;
}

-Edité le Lundi 21 mars 2005 à 19:17 par Kevin Kofler-
-Edité le Samedi 26 mars 2005 à 18:51 par Kevin Kofler-

[EDIT: Encore des erreurs. J'ai posté une version corrigé plus bas.]
-Edité le Dimanche 3 avril 2005 à 03:21 par Kevin Kofler-
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°13   Marquer comme non lu.
Pollux Ecrit le: Dimanche 20 mars 2005 à 23:38 Déconnecté(e)    Voir le profil de Pollux Envoyer un email à Pollux Envoyer un message privé à Pollux  

c'est quoi l'interet d'utiliser une extension GNU lourde ({...}) alors que la virgule qui est du C ANSI standard fait la meme chose de maniere bien plus jolie ?
    
./Post n°14   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 21 mars 2005 à 00:10 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


({...}) est plus général que la virgule.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°15   Marquer comme non lu.
Pollux Ecrit le: Lundi 21 mars 2005 à 18:59 Déconnecté(e)    Voir le profil de Pollux Envoyer un email à Pollux Envoyer un message privé à Pollux  

Mais justement cette generalite est completement inutile dans ce cas precis, ca ne fait qu'alourdir la notation... de meme que ({i++;}) est plus general que i++, ou ({({i++;})}) que ({i++;}), ce n'est pas pour autant que c'est une meilleure idée d'utiliser ca #triso# Surtout que tu reduis gratuitement la portabilité de ton programme en faisant ca (en l'occurrence, sur TI ce n'est pas genant, mais c'est une tres mauvaise habitude a prendre...), et c'est plus lourd a lire...
    
./Post n°16   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 21 mars 2005 à 19:17 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Et en plus j'ai oublié un ; à cause de ça. :D (Il faut un ; avant le }, je l'ai mis à un endroit et oublié à l'autre.) C'est corrigé...
-Edité le Lundi 21 mars 2005 à 19:17 par Kevin Kofler-
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°17   Marquer comme non lu.
Fl0D Ecrit le: Mercredi 23 mars 2005 à 16:59 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Merci c'est super sympa !
Oui aucun erreur de compilation :)
Par contre ça m'affiche 0 étapes.
(j'ai pas eu le temps de voir le code qui est un peu très dur pour moi ^^)

Au fait c'est toi Kevin qui a fait TIGCC (avec d'autres sous-entendu) ?
Il est vraiment cool comme programme. Vraiment super pratique. Merci.
Programmeur : Ma page
    
./Post n°18   Marquer comme non lu.
Folco Ecrit le: Mercredi 23 mars 2005 à 17:46 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


C'est le mainteneur actuel. Pour les détails, regardes dans la doc.
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°19   Marquer comme non lu.
Fl0D Ecrit le: Samedi 26 mars 2005 à 18:07 Déconnecté(e)    Voir le profil de Fl0D Envoyer un email à Fl0D Visiter le site WEB de Fl0D Envoyer un message privé à Fl0D  

Aïe aïe j'ai essayé le code de Kevin il n'y pas d'erreurs de compilation, mais ça m'affiche 0 étape pour tout a.
Je ne comprends rien du tout, je vois même pas où est l'algorithme !
while(({push_less_than((ESI[]){1,1,POSINT_TAG}+2,a);*top_estack==TRUE_TAG;}))
{
if (({push_mod(a,(ESI[]){2,1,POSINT_TAG}+2); is0(a);}))
{
push_integer_quotient(a,(ESI[]){2,1,POSINT_TAG}+2);
a = top_estack;
}
else
{
push_product((ESI[]){3,1,POSINT_TAG}+2,a); push_sum(top_estack,(ESI[]){1,1,POSINT_TAG}+2);
a = top_estack;
}
J'ai vraiment du mal :(
Programmeur : Ma page
    
  :: Index » Forum Ti68K » Programmation C » Syracuse ou Collatz (53 réponse(s))
Pages : 1/3     « [1] 2 3 » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 80.17ms avec 18 requetes