暑假第二场积分赛——————大数斐波那契数列

题目大意是给定你数列前两项f0=0,f1=1,先给你一个数x,问是第几项?其中可能出现1e+4项

题意分析:题目中说可能出现1e+4项,那么可想而知是无法用数组来正常储存每一项的数字的,因为数列的递增速度很快,在第40项时就已超出long long 的范围,所以这时就需要储存一个数的溢出值,尽管溢出值并不等价于原来的数字,但是对于同一个数字来说,溢出的值相同,而对于不相同的项,溢出值相同的概率十分小,可以忽略不计,所以就得到了这道题的整体思路

代码`

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e+4;
int f[maxn+100]={0,1};
map<long long ,int> mp;

int main()
{
    mp[0]=0;
    mp[1]=1;
    for(int i=2;i<maxn+100;i++)
    {
        f[i]=f[i-1]+f[i-2];
        mp[f[i]]=i;
    }
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        unsigned long long ans=0;
        for(int i=0;i<s.size();i++)
        {
            ans+=(ans*10+s[i]-'0');
        }
        cout<<mp[ans]<<endl;
    }
    return  0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/81351780