2016-10-31 3 views
0

J'essaye de calculer l'index du nombre de Fibonacci avec 1000 chiffres.Quelle est la bonne façon d'utiliser les fonctions entières GMP dans les programmes C?

int i = 0, cnt = 2; 

mpz_t limit; 
mpz_init (limit); 
mpz_ui_pow_ui(limit,10UL,999UL); 

mpz_t fib[3]; 

for (i = 0; i < 3; i++) 
    mpz_init2(fib[i], 1024UL); 

mpz_set_ui(fib[0],1UL); 
mpz_set_ui(fib[2],1UL);      

Je pense qu'il ya quelque chose de mal avec l'affectation 1 au 1er et dernier élément. Je le sais parce que ces éléments ne changent pas. Mais la boucle doit être valide jusqu'à ce cnt devient 4782.

La condition while ne 2 fois satisfait if .. <=0 ou 3 fois if .. >=0.

while(mpz_cmp(fib[i],limit)<=0) // should be <= only, not >= 
    { 
    i=(i+1)%3; 
    cnt++; 
    mpz_add(fib[i],fib[(i+1)%3],fib[(i+2)%3]); 
    } 

for (i = 0; i < 3; i++) 
    mpz_clear(fib[i]); 

mpz_clear(limit); 

printf("Fibonacci number with more than 1000 digits: %d\n",cnt); 

S'il vous plaît aider à trouver l'erreur logique dans ce (il compile parfaitement).

P.S. Je ne veux pas utiliser mpz_fib_ui intégré. Integer Functions

+0

@squeamishossifrage Merci pour ce qui suggère que, mais même après avoir modifié le code, il ne semble toujours pas pour donner la réponse.10^999 est correctement stocké dans la variable limite. – Rahul

+0

GMP peut effectuer une addition sur place ('mpz_add (a, a, b)'), vous n'avez donc besoin que de deux valeurs. Vous pouvez utiliser, par exemple, 'i = 1 - i' pour basculer entre les deux, ou vous pouvez vous débarrasser complètement de' i' et utiliser 'cnt% 2', ou' cnt & 1'. (Rendre 'cnt' non signé pour un éventuel léger gain d'efficacité, pas que ce soit perceptible.) – rici

Répondre

1

Après la boucle for, i = 3, donc l'instruction conditionnelle pour la boucle while dépend de fib [3]

Ajout i = 0; avant que la boucle while fixe, et me donne la sortie désirée:

nombres de Fibonacci avec plus de 1000 chiffres: 4782

+0

Merci, c'est tellement stupide de ma part. Dès la prochaine fois, je garderai un œil sur la valeur de chaque variable. – Rahul