大数的阶乘
输入一个正整数N,输出N的阶乘。
(0<=N<=1000)
在此题中,数据会超过int_max
所以使用字符串进行计算。下面的代码也算是模板,可用于其他场合
string addString(string a,string b)
{
int carry=0;//进位位
string res;//返回值
int i=a.size()-1;//下标
int j=b.size()-1;//下标
//当a或者b其中一个的下标小于0后退出
while(i>=0 && j>=0)
{
//a当前个人+b当前个位+进位位
int num=carry+a[i]-'0'+b[j]-'0';
//将num的个位变成字符串拼在res后面
res+=num%10+'0';
//去掉个位,剩下的值为进位的值,保存到下一次计算
carry=num/10;
i--;j--;
}
//此下两个循环为了处理其中较长剩下的字符串
while(i>=0)
{
//原理同上
int num=carry+a[i]-'0';
res+=num%10+'0';
carry=num/10;
i--;
}
while(j>=0)
{
int num=carry+b[j]-'0';
res+=num%10+'0';
carry=num/10;
j--;
}
//如果进位位还有值,将其转换为字符串拼接在res上
if(carry>0)
//int转字符串函数,部分编译器可能不能使用,需要自己写一个转换函数
res+=to_string(carry);
//翻转字符串
reverse(res.begin(),res.end());
return res;
}
//大数乘法(x<=10) 原理同上
string mulString(string a,int x)
{
int carry=0;
string res;
for(int i=a.size()-1;i>=0;i--)
{
int num=carry+(a[i]-'0')*x;
res+=num%10+'0';
carry=num/10;
}
if(carry>0)
res+=to_string(carry);
reverse(res.begin(),res.end());
return res;
}
//组合大数乘法
string MulString(string a,string b)
{
string res;
for(int i=0;i<b.size();i++)
{
int x=b[b.size()-1-i]-'0';
string num=mulString(a,x);
for(int j=0;j<i;j++)
num=mulString(num,10);
res=addString(res,num);
}
return res;
}
int main()
{
int n;
while(cin>>n)
{
string res="1";
for(int i=2;i<=n;i++)
{
res=MulString(res,to_string(i));
}
cout<<res<<endl;
}
return 0;
}