comment faire pour stocké un nombre enorme ? [C] - C++ - Programmation
Marsh Posté le 15-10-2002 à 15:17:47
Tableau de char
ou class BigInt
Fo recoder les opérations quoi
Marsh Posté le 15-10-2002 à 15:30:13
__int64 si t'es sous C++Builder
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/
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.
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 ?
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
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 !
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 !
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...
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
et moin je merde ds le 50 soit 701408733,1134903170 ,1836311903...
je suis pas arriver a 10000
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 et moin je merde ds le 50 soit 701408733,1134903170 ,1836311903... je suis pas arriver a 10000 |
Tu as un bug, ça monte trop vite
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
Marsh Posté le 15-10-2002 à 16:09:11
T'es sur que c'est pas plutot les nombres inferieurs à 10000 ?
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
Marsh Posté le 15-10-2002 à 16:32:19
suffirait d'utiliser des doubles, c'est jusqu'à 10e308
ou long double, 10e4932
Marsh Posté le 15-10-2002 à 16:42:48
2164 = 49066023051546258144270123954378957778492061276292174042724767207031652084134733055160830762397655966379920628530901794087762582726440720900227917415976432756306226813280395950785480264809573184930628213940329674208142686110843687052307676080365098339609609208912025055112308327531831645383789136083199481039737545907055621979265374508202611355695687221614481127337858393851133177067668163219825288193320120711778528329411687417160835104884787443994242
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 !
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 !
Marsh Posté le 15-10-2002 à 17:00:30
precis de chez precis
je comprend pas qd je mettre un long double ca compile bien mais l'exe plante
Marsh Posté le 15-10-2002 à 17:09:32
minours666 a écrit a écrit : precis de chez precis 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...
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...
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!
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...
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é
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.
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
Marsh Posté le 15-10-2002 à 19:51:55
je n'en doute pas mais aurai tu au moins une reponse a m'apporter ?
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!
Marsh Posté le 15-10-2002 à 19:59:43
antp a écrit a écrit : __int64 si t'es sous C++Builder |
marche aussi sous visu
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
Marsh Posté le 15-10-2002 à 20:32:50
va falloir que je mette à Python moi
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.
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
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 !
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
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 ...
Marsh Posté le 16-10-2002 à 16:28:52
Kristoph et DarkOli mettez vous d'accord, vous n'avez pas les même resultats
Marsh Posté le 16-10-2002 à 16:31:01
Reply
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