问题描述
输入一个正整数
n,输出
n!的值。
其中 n!=1*2*3*…* n。
其中 n!=1*2*3*…* n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组
A来表示一个大整数
a,
A[0]表示
a的个位,
A[1]表示
a的十位,依次类推。
将 a乘以一个整数 k变为将数组 A的每一个元素都乘以 k,请注意处理相应的进位。
首先将 a设为1,然后乘2,乘3,当乘到 n时,即得到了 n!的值。
将 a乘以一个整数 k变为将数组 A的每一个元素都乘以 k,请注意处理相应的进位。
首先将 a设为1,然后乘2,乘3,当乘到 n时,即得到了 n!的值。
输入格式
输入包含一个正整数
n,
n<=1000。
输出格式
输出
n!的准确值。
样例输入
10
样例输出
3628800
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int array_num[3000]; // 用来保存结果的数组
int total,rem=0,count,ix,n; //rem 用来保存进位
cin>>n;
memset(array_num,0,sizeof(array_num));//初始化array_num
ix=2999;
array_num[2999]=1;
for(count=2;count<=n;count++)//从2开始递增,直到n
{
while(ix>0)//遍历保存结果的数组的每一位
{
total=array_num[ix]*count+rem;
rem=0;//每次都将后面的进位置0
if(total>9)//有判断是否有进位
{
array_num[ix]=total%10;//取个位
rem=total/10;//注意n<1000,所以这样只可以进1位,故这方法可行,若n>10^10,则有错
}
else//没有进位则直接更新 array_num[ix]
array_num[ix]=total;
ix--;
}
rem=0;
total=0;
ix=2999;
}
for(ix=0;ix<3000;ix++) //结果输出
{
if(array_num[ix]!=0 | count==1)//输出从左 边开始第一个非0开始,直到第3000位
{
cout<<array_num[ix];
count=1;
}
}
}