Saturday 21 March 2009

HOJ ( acm.hdu.edu.cn ) 1042





#include <iostream>
#include <string>
#include <deque>
using namespace std;
class unsigned_big_integer{
protected:
typedef unsigned_big_integer class_type;
typedef unsigned long celltype;
std::deque<celltype> m_num; //大数的内部储存结构
public:
unsigned_big_integer(const unsigned long integer):m_num(){
unsigned long x=integer;
while(x){
m_num.push_front(x%10);
x/=10;
}
}
virtual ~unsigned_big_integer(){}

class_type& operator=(const class_type& bi){
this->m_num=bi.m_num;
return *this;
}
public:
virtual std::string str(){ //转换成字符串(用于输出)
std::string s(m_num.begin(),m_num.end());
for(std::string::iterator itr=s.begin();itr!=s.end();++itr)
*itr+='0';
return s;
}
virtual class_type& operator*=(unsigned long const x){
//
// 以 12345 * 12 作为例子,算法如下
//
// 12345
// * 12
// _______
// 60 (5*12)
// 48 (4*12)
// 36 (3*12)
// 24 (2*12)
// 12 (1*12)
// _________
// 148140
//
for(std::deque<celltype>::iterator itr=m_num.begin();itr!=m_num.end();++itr)
*itr*=x;
for(std::deque<celltype>::reverse_iterator ritr=m_num.rbegin();ritr!=m_num.rend()-1;++ritr){
*(ritr+1)+=(*ritr)/10;
*ritr%=10;
}
while(m_num.front()>=10){
celltype x=m_num.front()/10;
m_num.front()%=10;
m_num.push_front(x);
}
return *this;
}
};

int main()
{
for(int n;cin>>n;cout<<endl) {
if (n>=11) {
unsigned_big_integer ans(n);
for(;--n;)
ans*=n;
std::operator<<(cout,ans.str());
} else {
unsigned long ans=1;
for(;n;--n) //VC 会错误解释 for(;n--;) 的意思
ans*=n;
cout<<ans;
}
}
return 0;
}

No comments:

Post a Comment