以为是考察大数加法,用大数加法试了一下,超时了,才发现这样是绕弯路,得抄近路才行
大数加法版本:
#include<iostream> #include<list> using namespace std; typedef list<int> num; num operator+(num a,num b){ // plus b to a if(a.size()<b.size()) a.swap(b); a.push_front(0); auto it1=a.rbegin(),it2=b.rbegin(),end1=a.rend(),end2=b.rend(); int carry(0); for(;it2!=end2;++it2,++it1){ int tmp=carry + *it1 + *it2; carry=tmp/10; *it1=tmp%10; } for(;carry;++it1){ int tmp=carry + *it1; carry=tmp/10; *it1=tmp%10; } if(a.front()==0)a.pop_front(); return a; } int main(){ int k,n;cin>>k>>n; if(n==0)cout<<0; num ret; for(int i=1;i<=n;++i) ret=ret+num(i,k); for(auto x:ret)cout<<x; return 0; }后来的版本:
#include<iostream> #include<list> using namespace std; int main(){ int k,n; cin>>k>>n; if(n==0)cout<<0; list<int>ret; // paste a number to ret in each iteration int total = 0; for(int i=n; i>=1;--i){ total+=i*k; ret.push_front(total%10); total/=10; } while(total){ ret.push_front(total%10); total/=10; } for(auto x:ret)cout<<x; return 0; }