这个题啊,好像有点变态,就是有两个1,却只能输出一个,哎呀,大数加法啊,因为还没学STL,就写了很多函数,仰慕那些全是字符串处理的,各种看不懂,水啊啊啊啊啊
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int Num = 490;
const int Len = 110;
void Add(int a[],int b[],int c[])
{
int i = 1;
for(;i < Len;++i)
c[i] = a[i] + b[i];
for(i = 1;i < Len;++i)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
int length(int a[])
{
int i = Len - 1;
for(;i > 0 && !a[i];--i);
if(!i) return 1;
else return i;
}
int Max(int a[],int b[])
{
int i;
if(length(a) != length(b)) return length(a) > length(b);
else
{
for(i = length(a);i > 0;--i)
{
if(a[i] != b[i]) return a[i] > b[i];
}
}
return -1;
}
void getNum(char s[],int a[])
{
int i = 1,len = strlen(s);
for(;i <= len;++i)
a[i] = s[len - i] - '0';
}
int main(void)
{
int fibo[Num][Len];
int i,j,sum ;
char left[Len],right[Len];
int ll[Len],rr[Len];
memset(fibo,0,sizeof(fibo));
fibo[1][1] = 1;fibo[2][1] = 1;
for(i = 3;i < Num;++i)
Add(fibo[i - 1],fibo[i - 2],fibo[i]);
while(cin >> left + 1 >> right + 1 && (strcmp(left + 1,"0") || strcmp(right + 1,"0")))
{
sum = 0;
memset(ll,0,sizeof(ll));memset(rr,0,sizeof(rr));
getNum(left + 1,ll);getNum(right + 1,rr);
for(i = 1;i < Num && !Max(fibo[i],ll);++i);
for(i;i < Num;++i)
{
if(Max(fibo[i],rr) <= 0) sum++;
else break;
}
if(Max(fibo[1],ll) != 0 && Max(fibo[1],rr) <= 0) sum --;
cout << sum << endl;
}
system("pause");
return 0;
}