题目描述
这是一个斐波那契数列:
f1 = 1
f2 = 2
fn = fn-1 + fn-2 (n>=3)
蔡老板想知道,给你两个数 a、b,你能否求出在区间[a,b]里有多少个斐波那契数。
f1 = 1
f2 = 2
fn = fn-1 + fn-2 (n>=3)
蔡老板想知道,给你两个数 a、b,你能否求出在区间[a,b]里有多少个斐波那契数。
输入
多组数据输入。一行为一组输入数据,包括两个非负整数 a、b(a <= b <= 10^100),当a=b=0 时输入终止。
输出
对每组输入,输出单独一行,包含一个整数表示区间[a,b]里的斐波那契数个数。
样例输入
10 100
1234567890 9876543210
0 0
样例输出
5
4
1 /* 2 问题 输入两个数a和b,表示一个区间(a <= b <= 10^100),问之间有多少个斐波那契数 3 解题思路 由于数据范围很大,所以要先将最大范围内的斐波那契数用大整数加法模拟出来,用字符串存储,再在该区间内 4 找到符合条件的数的个数 5 6 易错 7 第一个数是1,如果数组从0开始存的话,第一个斐波那契数是0,不是1,记住wa了九遍的原因。 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<iostream> 12 using namespace std; 13 char f[600][200]; 14 15 void strsum(char sum[],char a[],char b[]); 16 int mycmp(char a[],char b[]); 17 void srev(char str[]); 18 19 int main() 20 { 21 strcpy(f[0],"1");//按照题目中说的第一个数为1,所以计数的时候千万要看清 22 strcpy(f[1],"2"); 23 int i,j; 24 for(i=2;i<600;i++){ 25 strsum(f[i],f[i-1],f[i-2]); 26 } 27 /*for(i=0;i<500;i++){ 28 cout<<i<<endl; 29 printf("%s ",f[i]); 30 }*/ 31 char a[200],b[200]; 32 while(1){ 33 scanf("%s%s",a,b); 34 if(strcmp(a,"0")==0 && strcmp(b,"0")==0) 35 break; 36 37 int k,ans=0; 38 for(k=0;k<500;k++){ 39 if(mycmp(f[k],a) >= 0 && mycmp(b,f[k]) >= 0){ 40 //puts(f[k]); 41 ans++; 42 } 43 } 44 printf("%d ",ans); 45 } 46 return 0; 47 } 48 49 void srev(char str[]) 50 { 51 int strl=strlen(str); 52 char s2[200]; 53 int i,j=0; 54 for(i=strl-1;i>=0;i--){ 55 s2[j++]=str[i]; 56 } 57 for(i=0;i<strl;i++){ 58 str[i]=s2[i]; 59 } 60 str[i]='