关于高精度数的问题:求斐波那契数列在一个区间内有几个数。区间要求0-10^100内。

来源:互联网 发布:js遍历所有标签 编辑:程序博客网 时间:2024/05/17 16:55

Description

Recall the definition of the Fibonacci numbers: 
f1 := 1 f2 := 2 fn := fn-1 + fn-2     (n>=3) 

Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a,b].

Input

The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a=b=0. Otherwise, a<=b<=10100. The numbers a and b are given with no superfluous leading zeros.

Output

For each test case output on a single line the number of Fibonacci numbers fi with a<=fi<=b.

Sample Input

10 1001234567890 98765432100 0

Sample Output

54
#include<stdio.h>  #include<string.h>  #define N 101char a[101];char b[101];char c[101];char fib[N][101];void reverse(char *ch){int len = strlen(ch);int i;char tmp;for(i = 0;i < len/2;i++){tmp = ch[i];ch[i] = ch[len-i-1];ch[len-i-1] = tmp;}}void add(char *a,char *b){int lena = strlen(a);int lenb = strlen(b);int i;int carry = 0;memset(c,0,101);for(i = 0;i < lena ||i < lenb;i++){if(i < lena && i < lenb){c[i] = a[lena-i-1] + b[lenb-i-1] + carry - '0';carry = 0;if(c[i] > '9'){c[i] -= 10;carry = 1;}}else if(i >= lena ){c[i] = b[lenb-i-1] +carry;carry = 0;if(c[i] > '9'){c[i] -= 10;carry = 1;}}else if(i >= lenb ){c[i] = a[lena-i-1] +carry;carry = 0;if(c[i] > '9'){c[i] -= 10;carry = 1;}}}if(carry == 1)c[i] = '1';reverse(c);}void fill_fib(){int i;strcpy(fib[1],"1");strcpy(fib[2],"2");for(i = 3;i < 101;i++){add(fib[i-1],fib[i-2]);strcpy(fib[i],c);}}void sub(char *n){int lena = strlen(n);if(n[lena-1] != '0'){n[lena-1]--;return;}int i = 0;while(n[lena-1-i] == '0'){n[lena-1-i] = '9';i++;}n[lena-1-i]--;return;}int cmp(char * a,char *b){if(strlen(a) > strlen(b))return 1;else if(strlen(a) < strlen(b))return -1;else{int i = 0;for(i = 0; i < strlen(a);i++){if(a[i] > b[i])return 1;else if(a[i] < b[i])return -1;else    continue;}}}int main(){memset(a,0,101);memset(b,0,101);fill_fib();while(1){scanf("%s%s",a,b);if(a[0] == '0' || b[0] == '0')break;int count = 0,i = 0;while(cmp(b,fib[++i]) > 0){if(cmp(a,fib[i]) <= 0)count++;}printf(" count = %d\n",count);}return 0;}
阅读全文
0 0
原创粉丝点击