zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    使用windows自带工具计算文件 MD5 值
    去除桌面图标的箭头
    给自己电脑(物理机)安装 linux 系统
    Python 字典 fromkeys()方法的坑
    Python 超时(运行时间太长) 自定义多长时间结束进程
    Win10 python2和python3共存
    verdidebussy的使用技巧
    <DC guide ---2>
    <DC guide ---1>
    <RTL To GDS ---第一阶段>
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5295100.html
Copyright © 2011-2022 走看看