HDU-1865-1sting

这是个高精度的模板题,自己递推一下,找到公式f[n]=f[n-1]+f[n-2],就可以很简单的用模板离线算出所有1的个数的情况;

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
string f[205],s;
string add(string a,string b)       //  自己写的简单高精度模板
{
    string ans="";
    int aa[1005]={0},bb[1005]={0};
    for(int i=0;i<a.size();i++) aa[a.size()-i-1]=a[i]-'0';  //  将字符装换成数字,并且反过来,便于模拟加法运算;
    for(int i=0;i<b.size();i++) bb[b.size()-i-1]=b[i]-'0';
    int len=a.size()>b.size()?a.size():b.size();
    for(int i=0;i<len;i++){
        aa[i]+=bb[i];           //  模拟加法,对应位置数相加,
        aa[i+1]+=aa[i]/10;      //  进位处理;
        aa[i]%=10;              //  取模;
    }
    while(!aa[len]) len--;      //  确定位数;
    for(int i=len;i>=0;i--) ans+=aa[i]+'0';     //  仍然转化为字符;
    return ans;
}
int main()
{
    int t;
    cin.sync_with_stdio(false);
    f[1]='1';f[2]='2';
    for(int i=3;i<202;i++) f[i]=add(f[i-1],f[i-2]); //  离线将结果算好;
    cin>>t;
    while(t--){
        cin>>s;
        cout<<f[s.size()]<<endl;
    }
    return 0;
}


 

你可能感兴趣的:(高精度,递推,高精度模板,HDU1865)