码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-19 16:03:52      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

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\n",r-l+1);
        else printf("%d\n",r-l);
    }
    return 0;
}

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

标签:

原文地址:http://www.cnblogs.com/atmacmer/p/5295100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!