20241215_1_4
1. 大数阶乘
题目
计算并打印出 50! 的值。
解析
由于 50! 远超过基本整数类型的范围,需要用数组存储每一位。计算过程中:
- 用数组
digits[]存储结果的每一位 - 从 1 乘到 50,每次乘法都需要处理进位
- 最后倒序输出数组即为结果
答案
c
#include <stdio.h>
#include <string.h>
#define MAX_DIGITS 65 // 50! 的位数为 65
void multiply(int digits[], int n, int* len) {
int carry = 0;
for(int i = 0; i < *len; i++) {
int prod = digits[i] * n + carry;
digits[i] = prod % 10;
carry = prod / 10;
}
while(carry) {
digits[*len] = carry % 10;
carry /= 10;
(*len)++;
}
}
int main(void) {
int digits[MAX_DIGITS] = {1}; // 初始值为 1
int len = 1;
// 计算阶乘
for(int i = 2; i <= 50; i++) {
multiply(digits, i, &len);
}
// 倒序输出结果
printf("50! = ");
for(int i = len - 1; i >= 0; i--) {
printf("%d", digits[i]);
}
printf("\n");
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39