这是个高精度的模板题,自己递推一下,找到公式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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/46941871