Jeg har ændret koden til at bruge GNU GMP biblioteket:
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
typedef void(*fibonacci_callback)(mpz_t, mpz_t);
void fib(mpz_t first, mpz_t last, fibonacci_callback callback) {
mpz_t i, fib, n1, n2;
mpz_init_set_si(fib, 0);
mpz_init_set_si(n1, 0);
mpz_init_set_si(n2, 1);
mpz_init_set_si(i, 1);
while (mpz_cmp(i, last) <= 0) {
mpz_add(fib, n1, n2);
if (mpz_cmp(i, first) >= 0 && mpz_cmp(i, last) <= 0) {
callback(i, fib);
}
mpz_set(n2, n1);
mpz_set(n1, fib);
mpz_add_ui(i, i, 1);
}
mpz_clear(i);
mpz_clear(fib);
mpz_clear(n1);
mpz_clear(n2);
}
void print_fibonacci(mpz_t num, mpz_t fib) {
printf("Fib(");
mpz_out_str(stdout, 10, num);
printf("): ");
mpz_out_str(stdout, 10, fib);
printf("\n");
}
int main(int argc, char ** argv) {
mpz_t first, last, result;
if (argc <= 1) {
printf("Usage: %s <first> [last]\n", argv[0]);
} else {
mpz_init_set_str(first, argv[1], 10);
if (argc > 2) {
mpz_init_set_str(last, argv[2], 10);
} else {
mpz_init_set(last, first);
}
fib(first, last, print_fibonacci);
mpz_clear(first);
mpz_clear(last);
}
return 0;
}
..så nu kan det beregne gigantiske Fibonacci tal:
$ ./fib 1000
Fib(1000): 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Bloodshed Dev-C++ havde GMP som modul, så jeg har compiled det til Windows. Hvis du ikke kan compile det selv, så kan du downloade det her:
http://www.the-playground.dk/uploads/Main/Fibonacci.exe