1143 多少个Fibonacci数

             1143 多少个Fibonacci数

       时间限制:500MS  内存限制:65536K
         提交次数:270 通过次数:16

           题型: 编程题   语言: G++;GCC

 

Description

给你如下Fibonacci 数的定义:
F1 = 1 
F2 = 2 
Fn = Fn-1 + Fn-2 (n >= 3) 
给你两个数a与b,现要求你计算在a与b之间(包括a、b)有多少个Fibonacci 数




输入格式

有多行,每行有两个数a、b,使用空格分隔,a <= b <= 10^100(即最大10的100次方)
最后一行为两个0



输出格式

除了最后一行,其它每一行要求输出在a与b之间的Fibonacci 数的个数,一行一个



 

输入样例

10 100
1234567890 9876543210
0 0



 

输出样例

5
4



 

作者

 admin

  这题刚开始做时懵逼了好久,后来别人提示了下才会做。。。各种坑。。。(代码注释里讲解解题步骤)

  1 /*#include <cstdio>
  2 #include <cstring>
  3 #define N 1000
  4 
  5 using namespace std;
  6 char f[N+5][N];
  7 //
  8 //高精度加法
  9 void big_plus(char a[],char b[],int t)
 10 {
 11     int c[N],d[N];
 12     memset(c,0,sizeof(c));memset(d,0,sizeof(d));//数组全部清0。
 13     int len_a,len_b,i,j,k;
 14     //
 15     i=1;
 16     len_a=strlen(a);len_b=strlen(b);
 17     //
 18     //将字符数组转为整型数组,逆方向。
 19     for(k=len_a-1;k>=0;k--)
 20         c[i++]=a[k]-'0';
 21     j=1;
 22     for(k=len_b-1;k>=0;k--)
 23         d[j++]=b[k]-'0';
 24     //
 25     k=len_a>len_b?len_a:len_b;
 26     for(i=1;i<=k;i++)//将每一位相加,满十进位。
 27     {
 28         c[i+1]+=(c[i]+d[i])/10;
 29         c[i]=(c[i]+d[i])%10;
 30     }
 31     //
 32     if(c[k+1]) //判断最高位是否有进位
 33         k=k+1;
 34     j=0;
 35     for(i=k;i>=1;i--) //将整型数组转变为字符数组存到f数组里。
 36         f[t][j++]=c[i]+'0';
 37 }
 38 //
 39 
 40 int big_cmp(char a[],char b[])//高精度 数字比较。a>b返回1,a=b返回0,a<b返回-1。
 41 {
 42     int i,len_a,len_b;
 43     len_a=strlen(a);
 44     len_b=strlen(b);
 45     //
 46     if(len_a>len_b)
 47         return 1;
 48     else if(len_a<len_b)
 49         return 0;
 50     else
 51     {
 52         for(i=0;i<len_a;i++)
 53         {
 54             if(a[i]>b[i])
 55                 return 1;
 56             else if(a[i]<b[i])
 57                 return 0;
 58             else continue;
 59         }
 60     }
 61     return -1; //上面的return均未执行,则说明a==b。
 62 }
 63 int main()
 64 {
 65     int i,j;
 66     char f1[N],f2[N];
 67     memset(f,'\0',sizeof(f));
 68     f[1][0]='1'; f[2][0]='2';
 69     //
 70     //下面循环累加,打表法。
 71     for(i=3;i<=N;i++)
 72     {
 73         big_plus(f[i-2],f[i-1],i);
 74     }
 75     //
 76     while(scanf("%s%s",f1,f2))
 77     {
 78         int cnt=0;
 79         if((f1[0]-'0')==0||(f2[0]-'0')==0)
 80             break;
 81         //
 82         for(i=1;i<=N;i++)//这个循环用来找f1的位置
 83         {
 84             if(big_cmp(f[i],f1)==-1)
 85             {
 86                 cnt=1;
 87                 i++;
 88                 break;
 89             }
 90             if(big_cmp(f[i],f1)>0)
 91             {
 92                 cnt=0;
 93                 break;
 94             }
 95         }
 96         for(j=i;j<=N;j++)//这个循环用来找f2的位置
 97         {
 98             if(big_cmp(f[j],f2)<=0)
 99                 ++cnt;
100             else
101                 break;
102         }
103         //
104         printf("%d\n",cnt);
105     }
106 
107 
108     return 0;
109 }
110 */
111 
112 #include<cstdio>
113 #include<cstring>
114 #define N 1000
115 char fb[N+5][N];//存储前1000项的fb
116 //高精度数比较 返回1表示a>b  返回-1表示a=b   0表示a<b
117 int big_cmp(char a[],char b[])
118 {
119     int i,len_a,len_b;
120     len_a=strlen(a);
121     len_b=strlen(b);
122     if(len_a>len_b) return 1;//先比长度
123     else if(len_a<len_b) return 0;
124     else//长度相同的时候再从高位开始逐一比较
125     {
126         for(i=0; i<len_a; i++)
127         {
128             if(a[i]>b[i]) return 1;
129             else if(a[i]<b[i]) return 0;
130             else continue;
131         }
132     }
133     return -1;//全部比较完毕,以上return未生效      就是 a=b
134 }
135 //高精度加法
136 void big_plus(char a[],char b[],int t)
137 {
138     int c[N],d[N];
139     memset(c,0,sizeof(c));  //数组全部清0。
140     memset(d,0,sizeof(d));
141     int len_a,len_b,i,j,k;
142     i=1;
143     len_a=strlen(a);
144     len_b=strlen(b);
145     //字符数组转为整形数组 ,逆置存放
146     for(k=len_a-1; k>=0; k--)
147         c[i++]=a[k]-'0';
148     j=1;
149     for(k=len_b-1; k>=0; k--)
150         d[j++]=b[k]-'0';
151 
152     k=len_a>len_b?len_a:len_b;
153     for(i=1; i<=k; i++)   //将每一位相加,满十进位。
154     {
155         c[i+1]+=(c[i]+d[i])/10;
156         c[i]=(c[i]+d[i])%10;
157     }
158     if(c[k+1]) k=k+1; //判断最高位是否有进位
159 
160     j=0;
161     for(i=k; i>=1; i--)   //将整形数组,转化为字符数组存在fb数组
162         fb[t][j++]=c[i]+'0';
163 }
164 int main()
165 {
166     int i,j;
167     char s1[N],s2[N];
168     memset(fb,'\0',sizeof(fb));
169     fb[1][0]='1';
170     fb[2][0]='2';
171     //下面循环累加,打表法。
172     for(i=3; i<=N; i++)
173         big_plus(fb[i-2],fb[i-1],i);
174 
175     while(scanf("%s%s",s1,s2))
176     {
177         int cnt=0;
178         if(!((s1[0]-'0')||(s2[0]-'0'))) break;
179         for(i=1; i<=N; i++)
180         {
181             //查找a的位置 i
182             if(big_cmp(fb[i],s1)==-1)
183             {
184                 cnt=1;
185                 i++;
186                 break;
187             }
188             if(big_cmp(fb[i],s1)>0)
189             {
190                 cnt=0;
191                 break;
192             }
193         }
194         for(j=i; j<=N; j++)
195             if(big_cmp(fb[j],s2)<=0) cnt++;
196             else break;
197         printf("%d\n",cnt);
198     }
199     return 0;
200 }

 

posted @ 2016-02-24 15:54  爱喝可乐的咖啡  阅读(466)  评论(0编辑  收藏  举报