求区间斐波那契数

问题 : 来简单地数个数

时间限制: 1 Sec  内存限制: 128 MB
提交: 14  解决: 6
[提交][状态]

题目描述

这是一个斐波那契数列:
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; 
 }

posted @ 2018-04-20 12:15  宿星  阅读(186)  评论(0编辑  收藏  举报