• 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,'',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
    ",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,'',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
    ",cnt);
    198     }
    199     return 0;
    200 }
  • 相关阅读:
    【Java/OS】取得系统的临时目录
    010CH32V307(WCH单片机)学习开发新建工程
    2STM32+ESP8266+Air302远程升级篇(自建物联网平台)STM32通过air302使用http下载程序文件,升级程序(单片机程序轮训检查更新)
    100CH32V307(WCH单片机)学习开发GPIO输出高低电平
    101CH32V307(WCH单片机)学习开发GPIO电平检测,引脚中断
    Leetcode 222. 完全二叉树的节点个数(中等)
    Leetcode 450. 删除二叉搜索树中的节点(中等)、701. 二叉搜索树中的插入操作(中等)、700. 二叉搜索树中的搜索(简单)、98. 验证二叉搜索树(中等)
    Leetcode 341. 扁平化嵌套列表迭代器(中等)
    Leetcode 797. 所有可能的路径(中等)
    Leetcode 96. 不同的二叉搜索树(简单) 95. 不同的二叉搜索树II(中等)
  • 原文地址:https://www.cnblogs.com/geek1116/p/5213292.html
Copyright © 2020-2023  润新知