阶乘会使得位数增加的很是快,好比20!的值的位数就已经要突破long long的上限了。因此常规的作法是处理不了的,要经过数组的方式来处理。固然这个数字自己不能超过int的范围,而且要提早预估这个数字的阶乘会有多少位。c++
以计算5的阶乘为例,来讲明这个算法:git
STEP1
初始化array[0] = 1
算法
STEP2
从2开始乘,1*2 = 2
,结果只有1位数,直接存到array[0]
数组
STEP3
2*3 = 6
,结果只有1位数,直接存到array[0]
spa
STEP4
6*4 = 24
,结果有2位数,2存到array[1]
,4存到array[0]
code
STEP5
24*4 = 120
,结果有3位数,1存到array[2]
,2存到array[1]
,0存到array[0]
ci
代码实现:it
#include<bits/stdc++.h> using namespace std; #define MAXLENGTH 50000 int main() { int n; while(cin >> n) { int* array = NULL; array = (int*)malloc(MAXLENGTH*sizeof(int)); if(!array) { cout << "malloc failed" << endl; break; } else { array[0] = 1; int digit = 1;//位数,随着计算不断更新 for(int i = 2;i <= n;i++) { int temp; int carry = 0;//进位 for(int j = 0;j < digit;j++)//将一个数每一位都乘以i { temp = array[j]*i+carry; array[j] = temp%10;//将一个数的每一位拆开存放到数组的每一位 carry = temp/10; } while(carry) { array[digit] = carry%10; carry /= 10; digit++; } } while(digit >= 1) cout << array[--digit];//逆序输出 cout << endl; } free(array); } return 0; }
以上的代码计算10000的阶乘没有问题di