题目描述
给定一个正整数 nn,求出 n!n! 的值。
输入描述
输入一个正整数 nn,n<=1000n<=1000。
输出描述
输出 n!n! 。
输入输出样例
示例
输入
10
输出
3628800
思路:
定义一个大数组A[]来存大数,数组的一个元素存大数的一位。例如A[0]A[0]存个位,A[1]A[1]存十位,A[2]A[2]存百位,等等。
- 那么A[]A[]需要定义成多大?也就是说,1000!1000!有多少位?可以自己估计,不过,可以用 windows 自带的计算器能直接算出来,1000!≈4×1025671000!≈4×102567。代码中定义一个更大的A[10000]。
- 模拟乘法计算,处理进位:例如356×8356×8。先计算个位的6×86×8,得4848,其中个位的88等于 4848,进位的44等于48/10=448/10=4。见我代码中的10∼1310∼13行,这几行实际上是处理了两个数的乘法,请仔细分析这几行代码。
- 按33的计算方法,计算n!n!。第88行的ii遍历了1∼n1∼n,计算n!n!。
- 最后打印是,从最高位开始打印。先找到最高位,即第一个不等于00的数,然后从高位往最低位打印。
代码:
#include <iostream>
using namespace std;
int A[10000] = {0}; //存结果,注意大的静态数组要定义在全局
int main(){
int n;
cin >> n;
A[0] = 1;
for(int i = 1;i <= n;i++){
int carry = 0; //进位
for(int j = 0;j < 10000;j++){
A[j] = A[j] * i + carry;
carry = A[j] / 10;
A[j] = A[j] % 10;
}
}
int last;
for(int i = 10000 - 1;i >= 0;i--){
if (A[i] != 0){
last = i;
break;
}
}
for(int i = last; i >= 0;i--) {
cout << A[i];
}
return 0;
}