题目描述:给定一个整数N(范围在0到10000之间),需要计算并输出N的阶乘N!。
解决方案:由于N的范围较大,直接使用常规数据类型存储阶乘结果会导致溢出,因此采用数组来模拟大数运算。每个数组元素存储一定数量的数字位,通过数组操作完成大数的乘法和输出。
#include
using namespace std;
// 定义常量,每个数组元素存储5位数
const int MAX = 100000; // %MAX的结果范围是[0, 99999]
const int N = 10001; // 数组大小
int a[N] = {0};
// 打印大数函数
void printBigNumber(int n) {
for (int i = 0; i if (i == 0) // 最高位忽略前导零
printf("%d", a[i]);
else // 其他位置按5位数输出
printf("%05d", a[i]);
}
printf("\n");
}
// 大数乘法函数
void multiply(int &n, int k) {
int carry = 0; // 进位
for (int i = n - 1; i >= 0; i--) {
int temp = a[i] * k + carry;
a[i] = temp % MAX;
carry = temp / MAX;
}
if (carry > 0) { // 如果有进位,添加新的最高位
for (int j = n; j > 0; j--) {
a[j] = a[j - 1];
}
a[0] = carry;
n++; // 实际数组长度增加
}
}
// 主处理函数
bool process() {
int n;
if (scanf("%d", &n) == EOF)
return false;
fill(a, a + N, 0); // 初始化数组
a[0] = 1; // 0和1的阶乘为1
int length = 1; // 初始长度为1
for (int i = 2; i <= n; i++) {
multiply(length, i);
}
printBigNumber(length);
return true;
}
int main() {
while (process());
return 0;
}
参考来源:博客链接