• POJ 2413 How many Fibs?#二分+大数加法


    http://poj.org/problem?id=2413

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    //到第485个fib数才有100位
    const int LAST=108;
    char res[500][110]; //存储fib数
    char *pos[500]; //存储每个fib数的首地址
    
    char* Addition(char *a,char *b,char *sum)
    {
        int i,j,k,first;
        //逆序开始,暂不处理进位
        for(i=strlen(a)-1,j=LAST;i>=0;i--,j--)
            sum[j]=a[i]-'0';
        for(i=strlen(b)-1,k=LAST;i>=0;i--,k--)
            sum[k]+=b[i]-'0';
        //获取sum结果的首位位置
        first=(j<k?j:k);
        //处理进位
        for(i=LAST;i>=first;i--)
        {
            sum[i-1]+=sum[i]/10;
            sum[i]=sum[i]%10+'0';
        }
        //去除前导0
        while(sum[first]=='0'&&first<LAST)
            first++;
        //返回sum的首位地址
        return &sum[first];
    }
    
    //计算fib数
    void fib()
    {
        memset(res,0,sizeof(res));
        memset(pos,NULL,sizeof(pos));
    
        strcpy(res[1],"1");
        strcpy(res[2],"2");
        pos[1]=res[1];
        pos[2]=res[2];
    
        for(int i=3;i<485;i++)
            pos[i]=Addition(pos[i-2],pos[i-1],res[i]);
    }
    
    int cmp(char *a,char *b)
    {
        int lena=strlen(a),lenb=strlen(b);
        if(lena==lenb)
            return strcmp(a,b);
        return lena>lenb?1:-1;
    }
    
    int binarySearch(char *num,bool &flag)
    {
        int l=1,r=480;
        while(l<=r)
        {
            int mid=(l+r)/2;
            int res=cmp(num,pos[mid]);
            if(res==0)
            {
                flag=true;
                return mid;
            }
            else if(res<0)
                r=mid-1;
            else l=mid+1;
        }
        return l;
    }
    
    int main()
    {
        fib();
        char a[105],b[105];
        while(scanf("%s %s",a,b)!=EOF)
        {
            if(strcmp(a,"0")==0&&strcmp(b,"0")==0)
                break;
    
            bool flagL=false,flagR=false;
            int l=binarySearch(a,flagL);
            int r=binarySearch(b,flagR);
            //返回值是[1,a)和[1,b)内的fib个数,所以若b也是fib数,输出时需+1
    
            if(flagR)
                printf("%d
    ",r-l+1);
            else printf("%d
    ",r-l);
        }
        return 0;
    }
  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5295100.html
Copyright © 2020-2023  润新知