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 satisfaitif
..<=0
ou3
foisif
..>=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
@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
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