输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
因为阶乘的结果非常长,设置一个tail,来指向最高位。
大数阶乘的模版
//a[] 中倒序存放被乘数
//b 为乘数
//tail指向最高位
//原理:用乘数去乘被乘数中的每一位(从低位到高位),再加上上一次运算的进位,将结果的最低位保留,进位储存参加下一次运算
int tail=0; //指向存放数据数组的最后一个位置
int value; //每一位的数值
int carry=0; //进位
for(int j=0; j<=tail; j++)
{
value=a[j]*b+carry; //每一位的运算结果
a[j]=value%10; //将最低位保留在原位置
carry=value/10; //计算进位
if(carry!=0&&j==tail) //当j循环到最后一位时,仍然有进位
{
tail++; //已存放数据的数组后面长度+1来存放最后一个进位数
}
}
#include <iostream>
using namespace std;
int main()
{
int a[20000]={0};
int n;
while(cin>>n)
{
int tail=0; //指向存放数据数组的最后一个位置
int value; //每一位的数值
int carry=0; //进位
a[0]=1; //阶乘从1开始
for(int i=2; i<=n; i++) //1*2 1*2*3 1*2*...*n
{
for(int j=0; j<=tail; j++)
{
value=a[j]*i+carry; //每一位的运算结果
a[j]=value%10; //将最低位保留在原位置
carry=value/10; //计算进位
if(carry!=0&&j==tail) //当j循环到最后一位时,仍然有进位
{
tail++; //已存放数据的数组后面长度+1来存放最后一个进位数
}
}
}
for(int i=tail; i>=0; i--)//输出
{
cout<<a[i];
}
cout<<endl;
}
return 0;
}