首页 > 代码库 > hdu 1316 How Many Fibs? (模拟高精度)

hdu 1316 How Many Fibs? (模拟高精度)

题目大意:

问[s,e]之间有多少个 斐波那契数。


思路分析:

直接模拟高精度字符串的加法和大小的比较。

注意wa点再 s 可以从 0 开始

那么要在判断输入结束的时候注意一下。


#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

struct node
{
    char str[111];
    int len;

    void print()
    {
        for(int i=len-1; i>=0; i--)
        {
            printf("%c",str[i]);
        }
        puts("");
    }

} fib[1500];

node operator + (const node &a,const node &b)
{
    node c;
    for(int i=0; i<=110; i++)c.str[i]='0';
    for(int i=0; i<max(a.len,b.len); i++)
    {
        int dig=c.str[i]-'0'+a.str[i]-'0'+b.str[i]-'0';
        int s=0;
        if(dig>=10)
        {
            dig-=10;
            s++;
        }
        c.str[i]=dig+'0';
        if(s)c.str[i+1]='1';
    }
    for(c.len=110; c.str[c.len]=='0' ; c.len--);
    c.len++;
    return c;
}
bool operator <= (node &a,node &b)
{
    if(a.len!=b.len)return a.len<b.len;
    else
    {
        for(int i=a.len-1; i>=0; i--)
        {
            if(a.str[i]>b.str[i])
                return false;
            else if(a.str[i]<b.str[i])
                return true;
        }
        return true;
    }
}

bool operator < (node &a,node &b)
{
    if(a.len!=b.len)return a.len<b.len;
    else
    {
        bool is=true;

        for(int i=0; i<a.len; i++)
            if(a.str[i]!=b.str[i])is=false;

        for(int i=a.len-1; i>=0 && !is; i--)
        {
            if(a.str[i]>b.str[i])
                return false;
            else if(a.str[i]<b.str[i])
                return true;
        }
        return !is;
    }
}

int main()
{
    fib[1].len=1;
    fib[1].str[0]='1';
    fib[2].len=1;
    fib[2].str[0]='2';
    for(int i=3;; i++)
    {
        fib[i]=fib[i-1]+fib[i-2];
        if(fib[i].len>101)break;
    }

    node s,e;
    while(scanf("%s%s",s.str,e.str)!=EOF)
    {
        if(s.str[0]=='0' && e.str[0]=='0')break;
        s.len=strlen(s.str);
        e.len=strlen(e.str);
        reverse(s.str,s.str+s.len);
        reverse(e.str,e.str+e.len);
        int i=1,st,ed;
        while(fib[i]<s)i++;
        st=i;
        while(fib[i]<=e)i++;
        ed=i;
        printf("%d\n",ed-st);
    }
    return 0;
}