//(斐波那契计数)
//1.求出1到100位的斐波那契数。
//2.将结果存在vector<string> gh;
//3.将开始的位置和结束的位置映射到结果中 求出斐波那契数的个数。
//方法:利用字符串完成加法运算
//刚开始以为是找规律想了很久没结果 又看了下打印的数发现密度比较大 直接放弃了
//string gh;
//gh.append(1,'w');意思是:在gh后面加一个‘w';后面只能加字符
//gh.append("dsjfhskfksd");在gh的后面加一个字符串
//注意细节问题
感受:当在做一道题目的时候,感觉有捷径 但是自己又没找到 我认为最好的方法就是最笨的方法
#include<iostream>
#include<cstdio>
#include<vector>
#define max 101
using namespace std;
vector<string> str;
string Fi_add(string a,string b)//在处理的过程中位数越低数越靠前。
{
string tem;
int num=0;
int jin=0;
char nu1;
for(int i=0; i<a.length(); i++)
{
num=(a[i]-'0')+(b[i]-'0')+jin;
jin=num/10;
nu1=num%10+'0';
tem.append(1,nu1);
}
for(int j=a.length(); j<b.length(); j++)
{
num=(b[j]-'0')+jin;
jin=num/10;
nu1=num%10+'0';
tem.append(1,nu1);
}
if(jin)
{
tem.append(1,'1');
}
return tem;
}
void Fi()
{
string a="1";
string b="2";
str.push_back(a);
str.push_back(b);
string tem;
while(b.length()<max)
{
tem=Fi_add(a,b);
a=b;
b=tem;
str.push_back(tem);
}
return;
}
int compare(string a, string b)//小于返回-1,大于返回1,等于返回0
{
if(b.length()!= a.length())
return a.length() > b.length() ? 1 : -1;
for (int i = 0, j = b.length() - 1; i < a.length(); i++, j--)
if (a[i] != b[j])
return a[i]> b[j] ? 1 : -1;
return 0;
}
int main()
{
string a,b;
Fi();
int start,end;
while(cin>>a>>b)
{
if(a=="0"&&b=="0") break;
for(int i=0; i<str.size(); i++) //此时str中的数是倒序存的
{
if(a.length()>str[i].length())
continue;
if(compare(a,str[i])<=0)
{
start=i;
break;
}
}
for(int i=str.size()-1; i>=0; i--) //此时str中的数是倒序存的
{
if(b.length()<str[i].length())
continue;
if(compare(b,str[i])>=0)
{
end=i;
break;
}
}
// printf("%d %d\n",start,end);
printf("%d\n",end-start+1);
}
return 0;
}
//1.求出1到100位的斐波那契数。
//2.将结果存在vector<string> gh;
//3.将开始的位置和结束的位置映射到结果中 求出斐波那契数的个数。
//方法:利用字符串完成加法运算
//刚开始以为是找规律想了很久没结果 又看了下打印的数发现密度比较大 直接放弃了
//string gh;
//gh.append(1,'w');意思是:在gh后面加一个‘w';后面只能加字符
//gh.append("dsjfhskfksd");在gh的后面加一个字符串
//注意细节问题
感受:当在做一道题目的时候,感觉有捷径 但是自己又没找到 我认为最好的方法就是最笨的方法
#include<iostream>
#include<cstdio>
#include<vector>
#define max 101
using namespace std;
vector<string> str;
string Fi_add(string a,string b)//在处理的过程中位数越低数越靠前。
{
string tem;
int num=0;
int jin=0;
char nu1;
for(int i=0; i<a.length(); i++)
{
num=(a[i]-'0')+(b[i]-'0')+jin;
jin=num/10;
nu1=num%10+'0';
tem.append(1,nu1);
}
for(int j=a.length(); j<b.length(); j++)
{
num=(b[j]-'0')+jin;
jin=num/10;
nu1=num%10+'0';
tem.append(1,nu1);
}
if(jin)
{
tem.append(1,'1');
}
return tem;
}
void Fi()
{
string a="1";
string b="2";
str.push_back(a);
str.push_back(b);
string tem;
while(b.length()<max)
{
tem=Fi_add(a,b);
a=b;
b=tem;
str.push_back(tem);
}
return;
}
int compare(string a, string b)//小于返回-1,大于返回1,等于返回0
{
if(b.length()!= a.length())
return a.length() > b.length() ? 1 : -1;
for (int i = 0, j = b.length() - 1; i < a.length(); i++, j--)
if (a[i] != b[j])
return a[i]> b[j] ? 1 : -1;
return 0;
}
int main()
{
string a,b;
Fi();
int start,end;
while(cin>>a>>b)
{
if(a=="0"&&b=="0") break;
for(int i=0; i<str.size(); i++) //此时str中的数是倒序存的
{
if(a.length()>str[i].length())
continue;
if(compare(a,str[i])<=0)
{
start=i;
break;
}
}
for(int i=str.size()-1; i>=0; i--) //此时str中的数是倒序存的
{
if(b.length()<str[i].length())
continue;
if(compare(b,str[i])>=0)
{
end=i;
break;
}
}
// printf("%d %d\n",start,end);
printf("%d\n",end-start+1);
}
return 0;
}