Твоя формула лажает уже начиная с 71-го члена ряда. Какие 10^5 цифр?
#include <math.h>
#include <stdio.h>
#include <gmp.h>
#include <stdlib.h>
unsigned long long int fib( unsigned long long int n){
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fib(n-1)+fib(n-2);
}
void fib2( int n){
/* working numbers */
mpz_t a, b;
//unsigned long long int N[2];
mpz_init (a);
mpz_init (b);
mpz_set_ui (a,1);
mpz_set_ui (b,1);
if(n == 0)
printf("0\n");
else if(n == 1)
printf("1\n");
else if(n == 2)
printf("1\n");
else {
mpz_t fib;
mpz_init (fib);
int i = 0;
for(i=0;i<n-2;i++){
mpz_add (fib, a, b);
mpz_set(a,b);
mpz_set(b,fib);
}
gmp_printf ("%Zd\n",fib);
}
}
double vova_fib(double x)
{
return pow(1+sqrt(5), x) / (pow(2,x)*sqrt(5))
- ( pow(1-sqrt(5), x) / (pow(2,x)*sqrt(5)) );
}
int main(int argc, char *argv[])
{
if (argc < 2)
fprintf(stderr, "usage: %s number [numbers...]\n", argv[0]),
exit(1);
for (int n=1; n<argc; n++) {
int x;
if (sscanf(argv[n], "%i", &x)<1)
fprintf(stderr, "not a number: %s\n", argv[n]),
exit(1);
printf("vova_fib(%d) = %.0lf\n", x, vova_fib(x));
printf("fib(%d) = ", x);
fib2(x);
puts("---");
}
return 0;
}
[ZX]
$ gcc -Wall fib.c -lm -lgmp && ./a.out $(seq 70 80) vova_fib(70) = 190392490709135 fib(70) = 190392490709135 --- vova_fib(71) = 308061521170130 fib(71) = 308061521170129 --- vova_fib(72) = 498454011879265 fib(72) = 498454011879264 --- vova_fib(73) = 806515533049395 fib(73) = 806515533049393 --- vova_fib(74) = 1304969544928660 fib(74) = 1304969544928657 --- vova_fib(75) = 2111485077978055 fib(75) = 2111485077978050 --- vova_fib(76) = 3416454622906716 fib(76) = 3416454622906707 --- vova_fib(77) = 5527939700884771 fib(77) = 5527939700884757 --- vova_fib(78) = 8944394323791488 fib(78) = 8944394323791464 --- vova_fib(79) = 14472334024676260 fib(79) = 14472334024676221 --- vova_fib(80) = 23416728348467744 fib(80) = 23416728348467685