这是个高精度的模板题,自己递推一下,找到公式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