求区间斐波那契数
问题 : 来简单地数个数
时间限制: 1 Sec 内存限制: 128 MB提交: 14 解决: 6
[提交][状态]
题目描述
这是一个斐波那契数列:
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
提示
#include<stdio.h>
#include<string.h>
#define N 1020
int fint[N][N];
char fi[N][N];
int s(char a[N],char b[N])
{
int len=strlen(a);
int i;
for(i=0;i<len;i++)
{
if((b[i]-'0')>(a[i]-'0'))
return 1;
if((b[i]-'0')<(a[i]-'0'))
return 0;
}
return 2;
}
void change(int i)
{
int j,m;
for(j=0;j<=299;j++)
if(fint[i][j]!=0)
break;
for(m=0;j<=299;m++)
{
fi[i][m]=fint[i][j]+'0';
j++;
}
}
void add(int fint[N][N],int i)
{
int point=0,j;
for(j=299;j>=0;j--)
{
fint[i][j]=fint[i-1][j]+fint[i-2][j]+point;
if(fint[i][j]>=10)
{
fint[i][j]-=10;
point=1;
}
else point=0;
}
}
int main()
{
int i,len,len1,len2,sum;
char a[N],b[N];
fint[1][299]=1; fint[2][299]=2;
for(i=3;i<=1000;i++)
add(fint,i);
for(i=1;i<=1000;i++)
change(i);
while(scanf("%s%s",a,b),a[0]!='0'||b[0]!='0')
{
sum=0;
len1=strlen(a);
len2=strlen(b);
for(i=1;i<=1000;i++)
{
len=strlen(fi[i]);
if(len<len1||len>len2)
continue;
if(len>len1&&len<len2)
sum++;
if(len1==len2)
{
if(len1==len&&s(a,fi[i])>0&&s(fi[i],b)>0)
sum++;
}
else {
if(len==len1&&s(a,fi[i])>0) sum++;
else if(len==len2&&s(fi[i],b)>0)
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}