zoukankan      html  css  js  c++  java
  • 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
    ",ed-st);
        }
        return 0;
    }
    


  • 相关阅读:
    判断单链表中是否有环,找到环的入口节点的理论证明
    交叉熵代价函数(作用及公式推导)
    C#调用C++、Opencv的Dll
    腾讯机器学习一面面经
    C#调用C++类库的几种方式
    2017年腾讯基础研究笔试感受
    关于开源库或者SDK的文档问题
    卷积神经网络Lenet-5实现
    NULL、0、nullptr 区别分析
    C++中,new/delete和malloc/free的区别
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4074171.html
Copyright © 2011-2022 走看看