Estoy tratando de escribir un código C que imprimirá los primeros 1 millón de números de Fibonacci.
El problema real es que quiero obtener el últimos 10 dígitos de F(1,000,000)
Entiendo cómo funciona la secuencia y cómo escribir el código para lograrlo, sin embargo, como F(1,000,000)
es muy grande, estoy luchando por encontrar una manera de representarlo.
Este es el código que estoy usando:
#include<stdio.h>
int main()
{
unsigned long long n, first = 0, second = 1, next, c;
printf("Enter the number of terms\n");
scanf("%d",&n);
printf("First %d terms of Fibonacci series are :-\n",n);
for ( c = 0 ; c < n ; c++ )
{
if ( c <= 1 )
next = c;
else
{
next = first + second;
first = second;
second = next;
}
printf("%d\n",next);
}
return 0;
}
estoy usando long long
para tratar de asegurarse de que haya suficientes bits para almacenar el número.
Esta es la salida de la primera 100
números:
First 100 terms of Fibonacci series are :-
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863
-1109825406
-1408458269
...
Truncó la salida pero puede ver el problema, creo que el tamaño del número generado está causando que el valor se desborde a negativo. No entiendo cómo detenerlo con toda honestidad.
¿Alguien puede indicarme la dirección correcta sobre cómo manejar números de este tamaño?
No he probado a imprimir el primer millón porque si falla al imprimir F(100)
no hay muchas esperanzas de que se imprima F(1,000,000)
.
consulte este tema: stackoverflow.com/questions/4827538/big-integer-in-c-or-c
– Mathieu Bordere
16 de noviembre de 2015 a las 10:52
¡Un largo tiempo no será suficiente!
– John Coleman
16 de noviembre de 2015 a las 10:52
UN
long long
debería ir por encima1836311903
al menos– Zorgatone
16 de noviembre de 2015 a las 10:53
@BasileStarynkevitch Creo que estás siendo innecesariamente duro. Es posible que un estudiante principiante no tenga suficiente experiencia con la aritmética modular para darse cuenta de que todo el cálculo se puede realizar mod 10^10. Las cosas que son obvias para un programador no siempre lo son para un estudiante.
– John Coleman
16 de noviembre de 2015 a las 11:51
Utilizar el
%lld
especificador de formato en lugar de%d
, pero eso solo lo llevará un poco más lejos. Pero de todos modos, las respuestas a continuación son bastante completas.– Jabberwocky
16 de noviembre de 2015 a las 14:25