1.问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
2.算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
3.解决思路
看了很多大佬的思路,我尽量以我现在能理解并且较简洁的方式写出来。
问题在于进位的判断,这不是很难,但我在写的时候遇到数字大了怎么也通不过的情况,后面参看很多别人的代码,发现我在判断数的首位出现了漏洞,紧急修改后通过了测试。
#include<iostream>
using namespace std;
int num = 10000; //估算后确定的位数
int main(){
int A[num]={0};
A[0]=1;
int n,tail=1;
cin >> n;
for(int i=2;i<=n;i++)
{
for(int j=0;j<tail;j++)
A[j]=A[j]*i;
for(int j=0;j<num;j++)
if(A[j]<10)
continue;
else
{
A[j+1]=A[j+1]+A[j]/10;
A[j]=A[j]%10;
if(j == tail-1) //判断是否为首位
tail++;
}
/*while(A[tail] != 0)
{
tail++;
}*/ //没有考虑到进位后首位后一位为0的情况
}
for(int i=tail-1;i>=0;i--) //倒序输出
cout << A[i];
return 0;
}