5.2.2阶乘的精确值
#include <iostream>
using namespace std;
//阶乘的精确值
//输入不超过1000的正整数n,输出n!的精确结果
// 1000的阶乘有3000位之多,只能用数组才能存的下
#define MAX 3000
int num[MAX] = {0};
int main()
{
int n;
cin >> n;
num[0] = 1;
int i,j,k;
//从2开始乘 j
for(i = 2;i < n;i++)
{
//对数组以个十百千的顺序存结果
//其实是模拟手工乘法例如算1*2时 ,就相当于(2999个0)0...01*2列竖式,就是每一位与2相乘并且加上进位,
//每乘一个数就会把这数组里的三千位更新
int c = 0;
for(j = 0;j < MAX;j++)
{
int s = num[j] * i + c;
num[j] = s % 10; //这里就相当于每一位乘以i之后的个位
c = s / 10; //相当于十位
}
}
//因为是按照个十百千储存在数组中的,所以要倒序输出
for(k = MAX-1; k >= 0; k--) {if(num[k]) break;} //从后往前找到第一个不为零的数字就是最高位
for(int m = k ; m >= 0; m--) {cout << num[m] << " ";}
return 0;
}