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


    题目描述

    这是一个斐波那契数列:
    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
    ",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
    ",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]='';
     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]='';
    122     //printf("
    ");
    123     srev(a);
    124     srev(b);
    125 }
  • 相关阅读:
    如何使用Orchard搭建敏捷个人的网站(1)
    英语:敏捷英语学习开始了
    英语:普特三步听写法(转载)
    色拉英语第一集第五幕:好胖的一只鸟
    介绍一个基于ASP.NET MVC的框架Catharsis
    色拉英语第2集第3幕:He’s my favorite
    Orchard:如何生成Hello World模块
    如何使用Orchard搭建敏捷个人的网站(2)
    色拉英语第一集第四幕:我不喜欢北京烤鸭
    色拉英语第一集第二幕:请问南京路怎么走?
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8881571.html
Copyright © 2020-2023  润新知