问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)

题目描述

这是一个斐波那契数列:
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
  1 /*
  2 问题  输入两个数a和b,表示一个区间(a <= b <= 10^100),问之间有多少个斐波那契数
  3 解题思路 由于数据范围很大,所以要先将最大范围内的斐波那契数用大整数加法模拟出来,用字符串存储,再在该区间内
  4 找到符合条件的数的个数
  5 
  6 易错
  7 第一个数是1,如果数组从0开始存的话,第一个斐波那契数是0,不是1,记住wa了九遍的原因。 
  8 */ 
  9 #include<cstdio>
 10 #include<cstring>
 11 #include<iostream>
 12 using namespace std;
 13 char f[600][200];
 14 
 15 void strsum(char sum[],char a[],char b[]);
 16 int mycmp(char a[],char b[]);
 17 void srev(char str[]);
 18 
 19 int main()
 20 {
 21     strcpy(f[0],"1");//按照题目中说的第一个数为1,所以计数的时候千万要看清 
 22     strcpy(f[1],"2");
 23     int i,j;
 24     for(i=2;i<600;i++){
 25         strsum(f[i],f[i-1],f[i-2]);    
 26     }
 27     /*for(i=0;i<500;i++){
 28             cout<<i<<endl;
 29             printf("%s\n",f[i]);    
 30     }*/
 31     char a[200],b[200];
 32     while(1){
 33         scanf("%s%s",a,b);
 34         if(strcmp(a,"0")==0 && strcmp(b,"0")==0)
 35                 break;
 36                 
 37         int k,ans=0;
 38         for(k=0;k<500;k++){
 39             if(mycmp(f[k],a) >= 0 && mycmp(b,f[k]) >= 0){
 40                 //puts(f[k]);
 41                 ans++;
 42             }
 43         }
 44         printf("%d\n",ans);
 45     }
 46     return 0;
 47 }
 48 
 49 void srev(char str[])
 50 {
 51     int strl=strlen(str);
 52     char s2[200];
 53     int i,j=0;
 54     for(i=strl-1;i>=0;i--){
 55         s2[j++]=str[i];
 56     }
 57     for(i=0;i<strl;i++){
 58         str[i]=s2[i];
 59     }
 60     str[i]='\0';
 61 }
 62 
 63 int mycmp(char a[],char b[])
 64 {
 65     int al=strlen(a),bl=strlen(b);
 66     if(al != bl){
 67         if(al > bl)
 68             return 1;
 69         else
 70             return -1;
 71     }
 72     else
 73     {
 74         int ans=strcmp(a,b);
 75         if(ans > 0)
 76             return 1;
 77         else if(ans == 0)
 78             return 0;
 79         else 
 80             return -1;
 81     }
 82 }
 83 
 84 void strsum(char strsum[],char a[],char b[])
 85 {
 86     int al=strlen(a),bl=strlen(b);
 87     srev(a);
 88     srev(b);
 89     int digsum[200]={0},i,j;
 90     for(i=0;i<al && i<bl;i++){
 91         digsum[i] = (a[i] - '0')+(b[i] - '0');
 92     }
 93     
 94     j=i;
 95     if(j < al){
 96         for(;j<al;j++){
 97             digsum[j] = (a[j] - '0');
 98         }    
 99     }
100     j=i;
101     if(j < bl){
102         for(;j<bl;j++){
103             digsum[j] = (b[j] - '0');
104         }    
105     }
106     
107     int suml=al > bl?al:bl;
108     for(i=0;i<suml;i++){
109         if(digsum[i] > 9){
110             digsum[i+1] ++;
111             digsum[i] %= 10;
112         }
113     }
114     if(digsum[suml] != 0)
115         suml++;
116     j=0;
117     for(i=suml-1;i>=0;i--){
118         strsum[j++] = digsum[i] + '0';
119         //printf("%d",digsum[i]);
120     }
121     strsum[j]='\0';
122     //printf("\n");
123     srev(a);
124     srev(b);
125 }

 

posted @ 2018-04-19 12:09  Reqaw  阅读(558)  评论(0编辑  收藏  举报