Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1425 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C] comment faire pour stocké un nombre enorme ?

n°228778
antp
Super Administrateur
Champion des excuses bidons
Posté le 16-10-2002 à 16:31:01  profilanswer
 

Reprise du message précédent :
 :lol:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 16-10-2002 à 16:31:01  profilanswer
 

n°228793
JeSuisPasU​nNumero
Posté le 16-10-2002 à 16:41:39  profilanswer
 

Je confirme le résulta de DarkOli :jap:
 
ps: thx Maple :D

n°228807
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 16:50:56  profilanswer
 

Zet a écrit a écrit :

Kristoph et DarkOli mettez vous d'accord, vous n'avez pas les même resultats  :o




Ben Kristoph a mis F(10001). C'est pour ça que j'ai clairement défini F(0), F(1), F(2) pour éviter toutes confusion ...


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°228811
JeSuisPasU​nNumero
Posté le 16-10-2002 à 17:00:41  profilanswer
 

Correct !
http://up.tf1.fr/mmdia/100/101/51/Original_83451.jpg

n°228814
ZeT
Ze Eternal Thrasher! 1st class
Posté le 16-10-2002 à 17:03:59  profilanswer
 

:jap:


---------------
Membre du mouvement [:mossieurpropre] L'un dans l'autre, vaut mieux être l'un !
n°228837
BENB
100% Lux.
Posté le 16-10-2002 à 17:32:25  profilanswer
 

DarkOli a écrit a écrit :

F(10000) = ...
Avec F(0)=0, F(1)=1, F(2)=1, F(3)=2, ...
 
Il y a 2090 chiffres ...




 
Merci de confirmer mes approx.

n°228841
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 17:42:21  profilanswer
 

BENB a écrit a écrit :

 
 
Merci de confirmer mes approx.




Ben on est d'accord ...
En fait ça part en couille là 3.3644764876460576.e2089


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°228845
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 17:49:22  profilanswer
 

minours666 a écrit a écrit :

ben le code code marche tres bien qd je le fais marcher pour des chiffre jusqu'a 40 mais passé c marche plus normal mes variables sont des int mais qd je met double ou long double ca plante litteralement :(




00035 9227465
00036 14930352
00037 24157817
00038 39088169
00039 63245986
00040 102334155
00041 165580141
00042 267914296
00043 433494437
00044 701408733
00045 1134903170
00046 1836311903
00047 2971215073
00048 4807526976
00049 7778742049
00050 12586269025
00051 20365011074
00052 32951280099
00053 53316291173
00054 86267571272
00055 139583862445
00056 225851433717
00057 365435296162
00058 591286729879
00059 956722026041
 
Ben c'est bizarre ça ???
Tu devrais pouvoir aller jusqu'à F(46) en signé et F(47) en non signé sur 32 bits !!! :D


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°228849
BENB
100% Lux.
Posté le 16-10-2002 à 17:59:14  profilanswer
 

DarkOli a écrit a écrit :

 
Ben on est d'accord ...
En fait ça part en couille là 3.3644764876460576.e2089




 
ca m'etonne pas...
 
en fait j'ai fait 10000*log10(Phi)-log10(5)/2;
 
ce qui me donne approximativement le log10 du nombre en question...   :D
 
ce qui me parraissait vraiment interressant c'etait de connaitre le nombre de chiffres...
 

n°228868
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 18:14:51  profilanswer
 

BENB a écrit a écrit :

 
 
ca m'etonne pas...
 
en fait j'ai fait 10000*log10(Phi)-log10(5)/2;
 
ce qui me donne approximativement le log10 du nombre en question...   :D
 
ce qui me parraissait vraiment interressant c'etait de connaitre le nombre de chiffres...




Ben de toute façon j'ai oublié les quelques notions de maths que j'avais mais heureusement pour combler ce vide je me débrouille bien en C :D


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
mood
Publicité
Posté le 16-10-2002 à 18:14:51  profilanswer
 

n°228870
BENB
100% Lux.
Posté le 16-10-2002 à 18:20:36  profilanswer
 

DarkOli a écrit a écrit :

 
Ben de toute façon j'ai oublié les quelques notions de maths que j'avais mais heureusement pour combler ce vide je me débrouille bien en C :D




 
Ben, je voulais pas prendre le temps de coder ca...

n°228890
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 18:59:05  profilanswer
 

BENB a écrit a écrit :

 
 
Ben, je voulais pas prendre le temps de coder ca...




Ben ce ne fut pas bien long en fait ...
bon c'est codé comme un porc, mais ça a le mérite d'être simple :D
 

Code :
  1. #include "stdio.h"
  2. #define TAILLE  10000
  3. void add(char* a, char* b, char* c);
  4. void retourne(char* c);
  5. int main(int nombre_parametres, char** liste_parametres)
  6. {
  7. char  a[TAILLE];
  8. char  b[TAILLE];
  9. char  c[TAILLE];
  10. char  d[TAILLE];
  11. int   i=0;
  12. int   n=0;
  13. memset(a, 0, TAILLE);
  14. memset(b, 0, TAILLE);
  15. memset(c, 0, TAILLE);
  16. c[0]=1;
  17. if (nombre_parametres > 1)
  18.   {
  19.    if (strlen(liste_parametres[1]) > 0)
  20.     {
  21.      i=0;
  22.      while (   (liste_parametres[1][i] != 0)
  23.             && (   (liste_parametres[1][i] >= '0')
  24.                 && (liste_parametres[1][i] <= '9') ) )
  25.       {
  26.        n=(n*10)+(liste_parametres[1][i]-'0');
  27.        i++;
  28.       }
  29.     }
  30.   }
  31. if (n == 0) n=10;
  32. fprintf(stdout, "%05d 0\n", 0);
  33. fprintf(stdout, "%05d 1\n", 1);
  34. for (i=2;i<=n;i++)
  35.   {
  36.    memcpy(a, b, TAILLE);
  37.    memcpy(b, c, TAILLE);
  38.    add(a, b, c);
  39.    /* Affichage */
  40.    memcpy(d, c, TAILLE);
  41.    retourne(d);
  42.    d[TAILLE-1]=0;
  43.    fprintf(stdout, "%05d %s\n", i, d);
  44.   }
  45. return 1;
  46. }
  47. void add(char* a, char* b, char* c)
  48. {
  49. int i=0;
  50. for (i=0;i<TAILLE;i++) c[i]=a[i]+b[i];
  51. for (i=0;i<(TAILLE-1);i++) /* 9999 à cause de la retenue !!! */
  52.   {
  53.    if (c[i] > 9)
  54.     {
  55.      c[i+1]+=c[i]/10;
  56.      c[i]=c[i]%10;
  57.     }
  58.   }
  59. }
  60. void retourne(char* c)
  61. {
  62. int   p=0;
  63. int   m=0;
  64. int   i=TAILLE-1;
  65. char  d=0;
  66. while ( (i >= 0) && (c[i] == 0) ) i--;
  67. p=i;
  68. for (i=0;i<(p+1);i++) c[i]+='0';
  69. /* Le nombre se trouve entre 0 et p inclus !!! */
  70. m=(p+1)>>1; /* Les m premiers chiffres sont inverses avec les m derniers */
  71. for (i=0;i<m;i++,p--)
  72.   {
  73.    d=c[i];
  74.    c[i]=c[p];
  75.    c[p]=d;
  76.   }
  77. }


Message édité par darkoli le 16-10-2002 à 19:00:14

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°228936
Kristoph
Posté le 16-10-2002 à 20:09:29  profilanswer
 

Je suis pas d'accord, toi tu as donné F(9999) !
 
Ok je sors :D
 
PS: Voici mon code :
 

Code :
  1. >>> def f(n):
  2. ...     a = 0
  3. ...     b = 1
  4. ...     for i in range(n):
  5. ...             a,b = b,(a+b)
  6. ...     return b
  7. ...


n°229078
darkoli
Le Petit Dinosaure Bleu
Posté le 16-10-2002 à 22:54:13  profilanswer
 

Kristoph a écrit a écrit :

Je suis pas d'accord, toi tu as donné F(9999) !
 
Ok je sors :D
 
PS: Voici mon code :
 

Code :
  1. >>> def f(n):
  2. ...     a = 0
  3. ...     b = 1
  4. ...     for i in range(n):
  5. ...             a,b = b,(a+b)
  6. ...     return b
  7. ...


 




Il est bien ton code, j'aimerais pouvoir en faire (du code) aussi court ...


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°229170
BettaSplen​dens
Tout cul tendu mérite son dû
Posté le 17-10-2002 à 09:08:37  profilanswer
 

DarkOli a écrit a écrit :

 
Il est bien ton code, j'aimerais pouvoir en faire (du code) aussi court ...



La différence, c'est que toi tu gères un tableau et tu recodes chaque opération alors que lui il n'a pas le pb de la limite du nb de digits sur son nombre ! donc le code est bcp plus court... mais il faut ensuite le langage qui va accepter ça pour calculer F(10000).
 
Je crois que cet exercice simple montre très précisément que chaque langage est différent et a des limites, et qu'un nombre de 1000 occurence à priori anodin peut s'avérer très méchant en fin de compte...
 
 
Ca me fait penser à une petite histoire du temps d'il y a très longtemps.
Un roi, pour remercier un de ces serviteurs, lui avait dit, choisit ce que tu veux, et je te le donnerai si ce n'est pas exagéré..
Le serviteur émis donc le souhait suivant
Voilà ce que je veux.. et il prit un échiquier en même temps.
Je place un grain de blé sur la 1ère case
2 sur la 2ème case
4 sur la 3ème case... etc..
jusqu'à remplir les 64 cases de l'échiquier.
Le roi se mit à rire... et accepta ceci directement...
En fin de compte, cette quantité de blé est phénoménale, je crois qu'elle représente d'ailleurs plus que la production mondiale si mes souvenirs sont bons (là je suis plus trop sûr, il faudrait refaire les calculs)...
 
Voilà donc comment des "petits nombres" peuvent devenir colossaux avec de simples aditions !


---------------
Tout cul tendu mérite son dû
n°229183
BENB
100% Lux.
Posté le 17-10-2002 à 09:35:35  profilanswer
 

BeTtASpLeNdEnS a écrit a écrit :

La différence, c'est que toi tu gères un tableau et tu recodes chaque opération alors que lui il n'a pas le pb de la limite du nb de digits sur son nombre ! donc le code est bcp plus court... mais il faut ensuite le langage qui va accepter ça pour calculer F(10000).
 
Je crois que cet exercice simple montre très précisément que chaque langage est différent et a des limites, et qu'un nombre de 1000 occurence à priori anodin peut s'avérer très méchant en fin de compte...
 
 
Ca me fait penser à une petite histoire du temps d'il y a très longtemps.
Un roi, pour remercier un de ces serviteurs, lui avait dit, choisit ce que tu veux, et je te le donnerai si ce n'est pas exagéré..
Le serviteur émis donc le souhait suivant
Voilà ce que je veux.. et il prit un échiquier en même temps.
Je place un grain de blé sur la 1ère case
2 sur la 2ème case
4 sur la 3ème case... etc..
jusqu'à remplir les 64 cases de l'échiquier.
Le roi se mit à rire... et accepta ceci directement...
En fin de compte, cette quantité de blé est phénoménale, je crois qu'elle représente d'ailleurs plus que la production mondiale si mes souvenirs sont bons (là je suis plus trop sûr, il faudrait refaire les calculs)...
 
Voilà donc comment des "petits nombres" peuvent devenir colossaux avec de simples aditions !




 
Normalement c'est pour remercier l'inventeur des echecs (d'ou l'échiquier)... et la quantité de blé demandée depassait certainement la production mondiale de l'epoque...

n°229285
darkoli
Le Petit Dinosaure Bleu
Posté le 17-10-2002 à 11:20:59  profilanswer
 

BENB a écrit a écrit :

 
 
Normalement c'est pour remercier l'inventeur des echecs (d'ou l'échiquier)... et la quantité de blé demandée depassait certainement la production mondiale de l'epoque...




Ouais, mais par contre par rapport à la taille des nombres à gerer le code est quand même très rapide. Il a fallu moins d'une seconde pour generer le fichier avec les valeurs de F(0) jusqu'à F(10000) pourtant le fichier fait 10Mo :ouch: quand même ...


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°229322
BENB
100% Lux.
Posté le 17-10-2002 à 11:49:18  profilanswer
 

DarkOli a écrit a écrit :

 
Ouais, mais par contre par rapport à la taille des nombres à gerer le code est quand même très rapide. Il a fallu moins d'une seconde pour generer le fichier avec les valeurs de F(0) jusqu'à F(10000) pourtant le fichier fait 10Mo :ouch: quand même ...




 
Tu as une belle machine  :D ...
 
Honnetement je pensais que le calcul serait plus long...
 
C'est un pour cela que j'ai prefére la voie des maths pour obtenir des approx... et entree autre le nombre de digits pour vous indiquer la taille necessaire pour stocker le nombre...

n°229346
darkoli
Le Petit Dinosaure Bleu
Posté le 17-10-2002 à 12:04:58  profilanswer
 

BENB a écrit a écrit :

 
 
Tu as une belle machine  :D ...
 
Honnetement je pensais que le calcul serait plus long...
 
C'est un pour cela que j'ai prefére la voie des maths pour obtenir des approx... et entree autre le nombre de digits pour vous indiquer la taille necessaire pour stocker le nombre...




Ben ils ont été très gentils avec moi au boulot ... :D (J'ai un joli PIV 1.7Ghz tout neuf sous linux et il est rapide je trouve ...).
 
Ben j'ai pas trop réfléchis en ce qui concerne la taille des nombres. Je suis plutôt du genre bidouilleur, je fais le prog est après je regarde ce que ça donne et si c'est trop long ben je regarde pourquoi ... :D


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°229882
Musaran
Cerveaulté
Posté le 18-10-2002 à 04:32:53  profilanswer
 

BeTtASpLeNdEnS a écrit a écrit :

En fin de compte, cette quantité de blé est phénoménale, je crois qu'elle représente d'ailleurs plus que la production mondiale


Ça représente la production mondiale actuelle pendant 2000 ans.
 
Un autre:
Prenez une simple feuille.
Pliez-la en deux, 50 fois de suite.
Le bloc obtenu mesure (théoriquement) la distance Terre-Lune.
 
Un autre: Les tours de Hanoï.
Avec 64 disques, en faisant 1 mouvement par seconde, l'âge de l'univers n'y suffirait pas.
 
L'échelle des valeurs humaines est plus linéaire que logarithmique, on ne comprends pas intuitivement ces grandeurs...
 
A votre avis, jusqu'à quelle profondeur peut-on calculer cette fonction (j'ai oublié le nom de l'original) ?

Code :
  1. int recurse(int i){
  2. return i>0 ? recurse(i-1)+recurse(i-2) : recurse(i+1) + recurse(i+2)
  3. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°229905
Kristoph
Posté le 18-10-2002 à 09:35:02  profilanswer
 

Il n'y a pas ce condition d'arret dans ta fonction ? Tu n'es pas pret d'obtenir un resultat !

n°229909
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 18-10-2002 à 09:38:52  profilanswer
 

tu ferais mieux de jouer avec la fonction d'Ackerman....


---------------
du bon usage de rand [C] / [C++]
n°230059
BettaSplen​dens
Tout cul tendu mérite son dû
Posté le 18-10-2002 à 13:58:02  profilanswer
 

Musaran a écrit a écrit :

Ça représente la production mondiale actuelle pendant 2000 ans.
Un autre:
Prenez une simple feuille.
Pliez-la en deux, 50 fois de suite.
Le bloc obtenu mesure (théoriquement) la distance Terre-Lune.
 
Un autre: Les tours de Hanoï.
Avec 64 disques, en faisant 1 mouvement par seconde, l'âge de l'univers n'y suffirait pas.
 
L'échelle des valeurs humaines est plus linéaire que logarithmique, on ne comprends pas intuitivement ces grandeurs...



ouaip, belle reflexion!!
Pour le bloc, je connaissais pas...
par contre, un petit "truc" à tester, c'est simplement de prendre une feuille de journal (n'importe lequel, même une grande feuille) et essayez de la plier "simplement" 8 fois sur elle même... y arriverez vous ? (vous allez me dire... ouaip, facile, mais essayez pour voir !)


---------------
Tout cul tendu mérite son dû
n°230664
Musaran
Cerveaulté
Posté le 19-10-2002 à 05:01:49  profilanswer
 

Kristoph a écrit a écrit :

Il n'y a pas ce condition d'arret dans ta fonction ? Tu n'es pas pret d'obtenir un resultat !


Mathématiquement, elle vaut l'infini positif.
Algorithmiquement, elle est infinie...
 
J'aurais dû donner cette forme:

Code :
  1. unsigned int Recurse(unsigned int i){
  2. return i==0 ? 0 : Recurse(i-1) +  Recurse(i-1);
  3. }

Pour calculer 45, il lui faut environ 1 an... (débordement mis à part)
 

Taz@PPC a écrit :

tu ferais mieux de jouer avec la fonction d'Ackerman....!


En fait j'arrive pas à retouver une fonction mathématique récursive pondue par je-sais-plus-quelle tronche.
Elle a des conditons d'arrêt, mais elle résiste aux analyses de profondeur et de fin.
 
C'est celle-là ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°230666
gilou
Modérateur
Modzilla
Posté le 19-10-2002 à 05:28:51  profilanswer
 

Taz@PPC a écrit a écrit :

tu ferais mieux de jouer avec la fonction d'Ackerman....




Code :
  1. /* In C: */
  2. unsigned int ackerman(unsigned int x, unsigned int y)
  3. {
  4.   return (x>0)?ackerman(x-1,(y>0)?ackerman(x,y-1):1):y+1;
  5. }
  6. /* In Java: */
  7. public static int ackerman (int m, int n) {
  8.     if (m == 0) return (n + 1);
  9.     if (n == 0) return (ackerman(m - 1, 1) );
  10.     return (ackerman (m - 1, ackerman (m, (n - 1))));
  11. }
  12. /* In Lisp:  */
  13. (defun ackerman(n m)
  14.   (cond ((zerop n) (+ 1 m))
  15.     ((zerop m) (ackerman (- n 1) 1))
  16.       (t (ackerman (- n 1) (ackerman n (- m 1))))))
  17. /* In Prolog: */
  18. ackerman(0,M,R):-R is M+1,!.
  19. ackerman(N,0,R):-R1 is N-1,ackerman(R1,1,R).
  20. ackerman(N,M,R):-N1 is N-1,M1 is M-1,ackerman(N,M1,R1),ackerman(N1,R1,R).
  21. /* In Pascal: */
  22. function ackerman(x, y : LongInt) : LongInt;
  23. begin
  24.   if      (x = 0) then  ackerman:= y+1
  25.   else if (y = 0) then  ackerman:= ackerman(x-1, 1)
  26.        else             ackerman:= ackerman(x-1, ackerman(x, y-1));
  27. end;


 
ackerman(0, n) = n + 1  
ackerman(1, n) = 2+(n + 3) - 3  
ackerman(2, n) = 2×(n + 3) - 3  
ackerman(3, n) = 2^(n + 3) - 3  
ackerman(4, n) = 2^2^...^2 - 3  (n + 3 termes dans l'exponentiation)  
 
A+,


Message édité par gilou le 19-10-2002 à 05:34:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°230676
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 10:19:59  profilanswer
 

tu devrais pouvoir calculer ack(i, n) pour i entre 0 et 3 et n entre 0 et 10
 
(4, 0) ok
(4, 1) un peu plus long
(4, 2) jamais
 
encore faut il que ta pile le supporte


---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C] Compter le nombre de chiffres dans un nombre![C] afficher un nombre en base 2
UNIX Scheme... faire un algo qui dit si un nombre est premier[C/C++] Générer un nombre premier à 30 chiffres
[PHP]limiter le nombre de reponse (forum) par page...[PHP-MySQL] Compter le nombre d'occurences d'une valeur.
[ORACLE] Suppression gd nombre enregistrements[C++] Nombre d'éléments d'un tableau dynamique ???
Calcul du nombre de jours entre 2 datesnombre d'objet ds un doc XML (avec un parseur de type DOM)
Plus de sujets relatifs à : [C] comment faire pour stocké un nombre enorme ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR