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

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

Marsh Posté le 15-10-2002 à 15:16:39    

je doit faire un prog qui incremente a en fonction de c 2 valeurs precedente tel que a=a(n-1)+a(n-2)
 
ex:0,1,1,2,3,5,8,13....
 
 
mais arriver un moment ma variable est tellement enorme que mon prog tourne plus :/

Reply

Marsh Posté le 15-10-2002 à 15:16:39   

Reply

Marsh Posté le 15-10-2002 à 15:17:47    

Tableau de char
ou class BigInt
Fo recoder les opérations quoi :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 15-10-2002 à 15:27:10    

OU change de langage... python par exemple

Reply

Marsh Posté le 15-10-2002 à 15:30:13    

__int64 si t'es sous C++Builder :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-10-2002 à 15:34:08    

Ou tu utilises une bibliothèque pour gérer les grands nombres :
 
http://www.swox.com/gmp/


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-10-2002 à 15:41:33    

minours666 a écrit a écrit :

je doit faire un prog qui incremente a en fonction de c 2 valeurs precedente tel que a=a(n-1)+a(n-2)
 
ex:0,1,1,2,3,5,8,13....
 
 
mais arriver un moment ma variable est tellement enorme que mon prog tourne plus :/
 




 
a lala, fibonacci. t'en fout, c'est sans doute pas le but de ton tp.


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 15-10-2002 à 15:45:39    

Taz@PPC a écrit a écrit :

 
 
a lala, fibonacci. t'en fout, c'est sans doute pas le but de ton tp.




 
de koi pas le but ?  :)

Reply

Marsh Posté le 15-10-2002 à 15:47:16    

kadreg a écrit a écrit :

Ou tu utilises une bibliothèque pour gérer les grands nombres :
 
http://www.swox.com/gmp/




 
tu m'interresses mais je debute en prog alors je c pas trop comment faire si tu pouvais detailé un peu ;)
 
merci  :jap:

Reply

Marsh Posté le 15-10-2002 à 15:49:18    

c du Fibonacci ça dis moi !
 
Grand genre quoi comme nb ?
à part un tableau je vois pas grand chose de pratique  
Surtout que tu auras juste à recoder le '+', donc ça reste super jouable !


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 15-10-2002 à 15:51:45    

minours666 a écrit a écrit :

je doit faire un prog qui incremente a en fonction de c 2 valeurs precedente tel que a=a(n-1)+a(n-2)
 
ex:0,1,1,2,3,5,8,13....
 
 
mais arriver un moment ma variable est tellement enorme que mon prog tourne plus :/
 



je me reprends.. la vraie suite de Fibonacci commence ainsi => 1, 2, 3, 5, 8, 13, 21,...
 
Dans Fibonacci il n'y a pas de 0 ni de redoublement du 1 !
En tout cas, c'est pour moi la suite la plus "parfaite" et plus extraordinaire qui puisse exister !


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 15-10-2002 à 15:51:45   

Reply

Marsh Posté le 15-10-2002 à 16:00:11    

BeTtASpLeNdEnS a écrit a écrit :

je me reprends.. la vraie suite de Fibonacci commence ainsi => 1, 2, 3, 5, 8, 13, 21,...
 
Dans Fibonacci il n'y a pas de 0 ni de redoublement du 1 !
En tout cas, c'est pour moi la suite la plus "parfaite" et plus extraordinaire qui puisse exister !
 




Oui mais par extention toutes les suites doublement recurentes du type
Un+1 = A.Un + B.Un-1 sont aussi appellées suites de Fibonacci...

Reply

Marsh Posté le 15-10-2002 à 16:00:57    

BeTtASpLeNdEnS a écrit a écrit :

c du Fibonacci ça dis moi !
 
Grand genre quoi comme nb ?
à part un tableau je vois pas grand chose de pratique  
Surtout que tu auras juste à recoder le '+', donc ça reste super jouable !
 




 
ben je dois faire ca 10000 fois donc ca monte tres haut  :D  
et moin je merde ds le 50 soit 701408733,1134903170 ,1836311903...
je suis pas arriver a 10000  :lol:  

Reply

Marsh Posté le 15-10-2002 à 16:01:26    

minours666 a écrit a écrit :

 
 
ben je dois faire ca 10000 fois donc ca monte tres haut  :D  
et moin je merde ds le 50 soit 701408733,1134903170 ,1836311903...
je suis pas arriver a 10000  :lol:    




 
Tu as un bug, ça monte trop vite


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-10-2002 à 16:04:08    

kadreg a écrit a écrit :

 
Tu as un bug, ça monte trop vite




 
J'ai rien dit ...
 
http://math.holycross.edu/~davids/ [...] b0-99.html


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-10-2002 à 16:09:11    

T'es sur que c'est pas plutot les nombres inferieurs à 10000 ?

Reply

Marsh Posté le 15-10-2002 à 16:10:05    

BENB a écrit a écrit :

T'es sur que c'est pas plutot les nombres inferieurs à 10000 ?




 
certain ;)

Reply

Marsh Posté le 15-10-2002 à 16:32:19    

suffirait d'utiliser des doubles, c'est jusqu'à 10e308
ou long double, 10e4932 :D


Message édité par antp le 15-10-2002 à 16:33:37

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-10-2002 à 16:42:48    

2164 =   49066023051546258144270123954378957778492061276292174042724767207031652084134733055160830762397655966379920628530901794087762582726440720900227917415976432756306226813280395950785480264809573184930628213940329674208142686110843687052307676080365098339609609208912025055112308327531831645383789136083199481039737545907055621979265374508202611355695687221614481127337858393851133177067668163219825288193320120711778528329411687417160835104884787443994242

Reply

Marsh Posté le 15-10-2002 à 16:54:22    

minours666 a écrit a écrit :

 
 
certain ;)




 
Et quelle precision doit-tu avoir ?
 
Ce calcul me parait utopique...
 
Fib(n) = (1/sqrt(5))*(pow(phi1,n)-pow(phi2,n))
 
avec phi1 = (1+sqrt(5))/2
et phi2 = (1-sqrt(5))/2
 
essai d'elever à la puissance 10 000 !
 

Reply

Marsh Posté le 15-10-2002 à 16:55:59    

BENB a écrit a écrit :

 
avec phi1 = (1+sqrt(5))/2




oh, le nombre d'or !

Reply

Marsh Posté le 15-10-2002 à 17:00:30    

precis de chez precis  :D  
 
je comprend pas qd je mettre un long double ca compile bien mais l'exe plante :/

Reply

Marsh Posté le 15-10-2002 à 17:09:32    

minours666 a écrit a écrit :

precis de chez precis  :D  
 
je comprend pas qd je mettre un long double ca compile bien mais l'exe plante :/




 
Avec un flottant tu n'aurra qu'une approximation :
 
f(1474)= 4.99225460548e+307
 
limite max d'un double, or la deja en double j'ai quoi quinze decimales sur les 307...
 
Avec un long double tu en aurras au mieux trente... :sarcastic:
sur les 2090 que compte F(10000)...
 
Et encore en passant par la formule de Binet, parce que sinon les erreurs d'arrondis se cumulant... aucune chance d'arriver au resultat...
 
A ce propos F(10000) = 3.3644764876460576 e2089
 
donc un long double devrait le contenir...


Message édité par BENB le 15-10-2002 à 17:19:42
Reply

Marsh Posté le 15-10-2002 à 17:24:28    

minours666 a écrit a écrit :

 
 
de koi pas le but ?  :)  




 
et bien vu comme ton code est catastrophique, je pense que le but n'est pas de concevoir une structure de donnée pour stocker des réels/grands entiers, mais bien de faire une fonction récursive.
 
tu dis vouloir calculer fibonacci(10000), cd n'est pas la peine de chercher comment le stocker, tu n'arriveras pas à le calculer: la complexité est exponentielle avec cette version récursive, et en ce qui concerne les appels recursifs, c'est pire!


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 15-10-2002 à 17:33:25    

Taz@PPC a écrit a écrit :

 
 
et bien vu comme ton code est catastrophique, je pense que le but n'est pas de concevoir une structure de donnée pour stocker des réels/grands entiers, mais bien de faire une fonction récursive.
 
tu dis vouloir calculer fibonacci(10000), cd n'est pas la peine de chercher comment le stocker, tu n'arriveras pas à le calculer: la complexité est exponentielle avec cette version récursive, et en ce qui concerne les appels recursifs, c'est pire!  




 
Pour l'instant il n'a pas donné le moindre code !
 
comment sais-tu qu'il envisage un code recursif ?
 
Pour la methode c'est clair qu'il faut faire une boucle sur des entiers.
 
sinon par la formule de binet en long double
 
ou alors ruser en double...
en passant par des logs...

Reply

Marsh Posté le 15-10-2002 à 17:47:22    

BENB a écrit a écrit :

 
 
Pour l'instant il n'a pas donné le moindre code !
 
comment sais-tu qu'il envisage un code recursif ?
 
Pour la methode c'est clair qu'il faut faire une boucle sur des entiers.
 
sinon par la formule de binet en long double
 
ou alors ruser en double...
en passant par des logs...




Citation :

je doit faire un prog qui incremente a en fonction de c 2 valeurs precedente tel que a=a(n-1)+a(n-2)


 
cette définition le laisse fortement suggéré


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 15-10-2002 à 18:41:18    

En stockant les digits dans une chaîne de caractères comme on les écrit à la main sur feuille de papier ?
 
En conservant la chaîne dans l'ordre digit de poids faible -> digit de poids fort, ça facilite la gestion d'allongement de chaîne. On la retourne à la fin (fonction strrev, ou à la main).
 
L'addition est pas trop difficile (ajout de chiffres et retenue comme appris à l'école). Faut juste conserver les n-1 et n-2.

Reply

Marsh Posté le 15-10-2002 à 19:39:00    

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 :(


Message édité par minours666 le 15-10-2002 à 19:45:03
Reply

Marsh Posté le 15-10-2002 à 19:50:28    

tu vas pouvoir aller à 41 si tu passes en unsigned!  :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 15-10-2002 à 19:51:55    

je n'en doute pas mais aurai tu au moins une reponse a m'apporter ?

Reply

Marsh Posté le 15-10-2002 à 19:58:06    

ben, il faut faire une approche objetet définir un ADT GrandNombre. si j'ai un peu de temps, je le ferai ce soir.
 
 
la solution de stocker la répresentation d'un nombre dans un char* / un chiffre ascii par char est effectivement une tres bonne idée. si tu ne trouves pas de librairies qui le fassent, au boulot!


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 15-10-2002 à 19:59:43    

antp a écrit a écrit :

__int64 si t'es sous C++Builder :D




 
marche aussi sous visu :D

Reply

Marsh Posté le 15-10-2002 à 20:20:38    

Je confirme, fais ca en Python
 
Je viens de faire le test et voici le resultat :
>>> f(2)
2
>>> f(10000)
54438373113565281338734260993750380135389184554695967026247715841208582865622349017083051547938960541173822675978026317384359584751116241439174702642959169925586334117906063048089793531476108466259072759367899150677960088306597966641965824937721800381441158841042480997984696487375337180028163763317781927941101369262750979509800713596718023814710669912644214775254478587674568963808002962265133111359929762726679441400101575800043510777465935805362502461707918059226414679005690752321895868142367849593880756423483754386342639635970733756260098962462668746112041739819404875062443709868654315626847186195620146126642232711815040367018825205314845875817193533529827837800351902529239517836689467661917953884712441028463935449484614450778762529520961887597272889220768537396475869543159172434537193611263743926337313005896167248051737986306368115003088396749587102619524631352447499505204198305187168321623283859794627245919771454628218399695789223798912199431775469705216131081096559950638297261253848242007897109054754028438149611930465061866170122983288964352733750792786069444761853525144421077928045979904561298129423809156055033032338919609162236698759922782923191896688017718575555520994653320128446502371153715141749290913104897203455577507196645425232862022019506091483585223882711016708433051169942115775151255510251655931888164048344129557038825477521111577395780115868397072602565614824956460538700280331311861485399805397031555727529693399586079850381581446276433858828529535803424850845426446471681531001533180479567436396815653326152509571127480411928196022148849148284389124178520174507305538928717857923509417743383331506898239354421988805429332440371194867215543576548565499134519271098919802665184564927827827212957649240235507595558205647569365394873317659000206373126570643509709482649710038733517477713403319028105575667931789470024118803094604034362953471997461392274791549730356412633074230824051999996101549784667340458326852960388301120765629245998136251652347093963049734046445106365304163630823669242257761468288461791843224793434406079917883360676846711185597501L
 
PS: c'était super rapide a calculer, si si.
 
PPS: A le plaisir de flooder horizontalement le forum ;)

Reply

Marsh Posté le 15-10-2002 à 20:32:50    

:ouch:  
 
va falloir que je mette à Python moi :)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-10-2002 à 21:06:03    

Moins d'une demi seconde sur un Athlon XP 1800. Faut aussi voir que l'interpreteur n'a pas grand chose à faire et que le coeur du travail viens de la lib de nombres a grande precision.

Reply

Marsh Posté le 15-10-2002 à 22:14:23    

Kristoph a écrit a écrit :

Moins d'une demi seconde sur un Athlon XP 1800. Faut aussi voir que l'interpreteur n'a pas grand chose à faire et que le coeur du travail viens de la lib de nombres a grande precision.




 
qui est en C


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 16-10-2002 à 14:20:24    

Juste pour faire une petite remarque par rapport à une reflexion lue plus haut !
 
=> qq'un a parlé de nombres en "float", etc...
La théorie des nombres, et toutes les suites sur des entiers n'ont pas pour intéret un ordre de grandeur, mais LE NOMBRE ENTIER précis !!!
à la rigueur, c'est peut etre plus le dernier chiffre (celui des unités) qui est intéressant dans tout ça !
 
Donc... on va pas s'amuser à travailler avec des décimaux ! ici ce sont les entiers qui sont les rois !
 
Faudrait que j'essaie de coder cette suite tiens.. ça peut être intéressant !


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 16-10-2002 à 15:52:22    

Voilà je viens de faire le prog en C (completement avec l'addition et l'affichage du nombre ...).
 
Et j'obtiens pour f(10000) :
 
Dans 3 secondes je mets le resulats car l fichier complet des fibos de 0 à 10000 fait 10Mo :d


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 16-10-2002 à 16:07:57    

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


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

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 16-10-2002 à 16:28:52    

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


Message édité par ZeT le 16-10-2002 à 16:29:11
Reply

Marsh Posté le 16-10-2002 à 16:31:01    

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed