参考链接:
大数阶乘(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; }