参考链接:
大数阶乘(N!)问题
https://www.jianshu.com/p/39eaa57f9b38
解题思路:将正整数N从1到N逐位相乘,即1 * 2 * 3...... * (N-1) * N。每次相乘后的值会存储到array[ ]中,其中一个数组元素中存储值中的一位数。当值小于10时直接存储,值大于10时,计算进位和本位,array[ j ]存储本位,array[ j+1 ]存储进位。
#include <iostream>
#include <cstdio>
using namespace std;
#define _for(i, a, b) for(int i = a; i <= b; i++)
#define _rre(i, a, b) for(int i = a; i >= b; i--)
const int maxn = 100000;
int main(){
int N;//正整数N
while(~scanf("%d", &N)){
int a[maxn] = {0};
int carry = 0;//carry表示进位数,刚开始进位为0
int point = 1;//point代表位数,刚开始只有一位a[1]
int j = 0;
a[1] = 1;//从a[1]开始
_for(i, 2, N){//N的阶乘
//循环a[],让每一位都与i乘
for(j = 1; j <= point; j++){
int tmp = i * a[j] + carry;// temp变量表示不考虑进位的值
carry = tmp / 10;// 计算进位大小
a[j] = tmp % 10;// 计算本位值
}
// 处理最后一位的进位情况
// 由于计算数组的最后一位也得考虑进位情况,所以用循环讨论
// 因为可能最后一位可以进多位;比如 12 * 本位数8,可以进两位
// 当进位数存在时,循环的作用就是将一个数分割,分割的每一位放入数组中
while(carry){
a[j] = carry % 10;
carry /= 10;
j++;
}
point = j - 1;// 由于上面while中循环有j++,所以位会多出一位,这里减去
}
_rre(i, point, 1){//逆序打印结果
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}
京公网安备 11010502036488号