求區間[a,b]內斐波那契數的個數,因為最大到了10的100次方,初步遞推一下,10的100次方左右,可達到斐波那契數列的第480項左右,因此用暴力枚舉+大數加法即可。
代碼如下:
#include <cstdio>#include <cstring>#include <cmath>char fibo[480][105];void Fibonacci(char *a, char *b, char *c)//斐波那契數列打表{ int len = strlen(a); for(int i=0; i<len; i++) { c[i] += a[i] + b[i] - '0'; if(c[i] < '0') c[i] += '0'; if(c[i] > '9') { c[i] -= 10; ++c[i+1]; } } if(c[len]==1) c[len] += '0';}int Compare(char *a, char *b)//比較兩個大數的大小{ int len_a = strlen(a), len_b(strlen(b)); if(len_a > len_b) return 1; else if(len_a < len_b) return -1; for(int i=0; i<len_a; i++) if(a[i] > b[len_b-i-1]) return 1; else if(a[i] < b[len_b-i-1]) return -1; return 0;}int main(){#ifdef test freopen("sample.txt", "r", stdin);#endif char a[105], b[105]; fibo[0][0] = 1+'0'; fibo[1][0] = 2+'0'; for(int i=2; i<=480; i++) Fibonacci(fibo[i-1], fibo[i-2], fibo[i]);// for(int i=1; i<=480; i++)// {//打表測試10的100次方內斐波那契數列的項數// printf("(%d)", strlen(fibo[i]));// for(int j=strlen(fibo[i])-1; j>=0; j--)// printf("%c", fibo[i][j]);// puts("");// } while(scanf("%s%s", a, b) != EOF) { if(!strcmp(a, "0") && !strcmp(b, "0")) break; int ct1, ct2; for(int i=0; i<=480; i++) if(Compare(a, fibo[i]) <= 0) { ct1 = i; break; } for(int i=ct1; i<=480; i++) if(Compare(b, fibo[i]) < 0) { ct2 = i; break; } printf("%d\n", ct2 - ct1); } return 0;}