//求99的阶乘
#include <vector>
#include <iostream>
using namespace std;
//100的阶乘
/************************************************************************/
/* 9332621544394415268169923885626670049071596826438162146859296389521759
9993229915608941463976156518286253697920827223758251185210916864000000000
000000000000000*/
/************************************************************************/
void main()
{
vector<int> v;
v.push_back(1);
vector<int> temp1; //存个位数临时乘积
vector<int> temp2; //存十位数临时乘积
vector<int>::iterator itor,itor1,itor2;
for (int n=1;n<100;n++) //16的阶乘算错
{
int i1=0; //个位数
int i2=0; //十位数
int res1=n%10; //个位数
int res2=n/10; //十位数
itor=v.begin();
temp2.push_back(0); //十位数压0入栈
for (;itor!=v.end();++itor)
{
int j=*itor;
int k1=j*res1; //乘数的个位数与之乘
i1+=k1;
temp1.push_back((i1%10)); //个位数乘积压栈
i1=i1/10; //进位
int k2=j*res2; //乘数的十位数与之乘
i2+=k2;
temp2.push_back((i2%10)); //十位数乘积压栈
i2=i2/10; //进位
}
if(i1!=0)
temp1.push_back(i1);
if(i2!=0)
temp2.push_back(i2);
itor1=temp1.begin();
itor2=temp2.begin();
int temp_sum=0;
v.clear();//将v清空,接受新数据
while (itor1!=temp1.end() && itor2!=temp2.end())
{
temp_sum+=(*itor1)+(*itor2);
v.push_back((temp_sum%10));
temp_sum=temp_sum/10;
++itor1;
++itor2;
}
while(itor1!=temp1.end())
{
temp_sum += (*itor1);
v.push_back((temp_sum%10));
temp_sum=temp_sum/10;
++itor1;
}
while(itor2!=temp2.end())
{
temp_sum += (*itor2);
v.push_back((temp_sum%10));
temp_sum=temp_sum/10;
++itor2;
}
//这里有可能十位数和个位数临时乘积相同的位数,同时到向量的尾部,
//而temp_sum不为0,即最高位有向前的进位,在26的阶层乘27时第一次产生这种情况
if(temp_sum!=0)
v.push_back(temp_sum);
temp1.clear(); //临时积清空
temp2.clear(); //临时积清空
}
//逆向输出
for (itor=v.end()-1;itor!=v.begin();--itor)
cout<<*itor;
cout<<*itor; //输出v.begin()
cout<<endl;
}