以为是考察大数加法,用大数加法试了一下,超时了,才发现这样是绕弯路,得抄近路才行
大数加法版本:
#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;
}