计算一个给定正整数 num
的阶乘。以下是代码的简要解释:
-
getJieCheng
函数:- 这个函数接受一个整数参数
num
。 - 如果
num
大于等于20,函数打印出 “越界” 并调用exit(-1)
终止程序执行,返回一个错误代码-1
。 - 如果
num
等于1,函数返回1,因为1的阶乘是1。 - 如果
num
大于1,函数递归调用自身计算num-1
的阶乘,然后与num
相乘,返回这个乘积。
- 这个函数接受一个整数参数
-
main
函数:- 程序首先打印提示信息,询问用户要求哪个数的阶乘。
- 使用
scanf
函数读取用户输入的数,并存储在变量num
中。 - 调用
getJieCheng
函数,传入用户输入的数num
,并将结果存储在unsigned long int
类型的变量ret
中。 - 使用
printf
函数打印出输入数的阶乘结果。 - 打印出
sizeof(long int)
的结果,展示long int
类型在当前平台上的大小。
代码中存在一些需要注意的地方:
printf
函数在打印阶乘结果时使用%ld
作为格式化输出符号,这是正确的,因为ret
是unsigned long int
类型。sizeof(long int)
的打印输出了long int
类型的大小,这与阶乘的计算没有直接关系,但可以提供关于数据类型大小的信息。- 程序没有对用户输入进行有效性检查,如果输入的是负数或非整数,程序的行为将是未定义的。
- 阶乘的计算结果可能非常大,即使是
unsigned long int
类型也可能溢出,特别是当输入的num
较大时。
为了改进这段代码,可以添加输入验证和处理阶乘溢出的逻辑:
#include <stdio.h>
#include <stdlib.h>
unsigned long long int getJieCheng(int num) {
if (num >= 20) { // 20! 已经是 `unsigned long long int` 能存储的最大值
printf("越界\n");
exit(-1);
}
if (num <= 1) {
return 1;
}
return getJieCheng(num - 1) * num;
}
int main() {
int num;
unsigned long long int ret;
puts("请输入要求的阶乘数:");
if (scanf("%d", &num) != 1 || num < 0) {
printf("请输入一个非负整数。\n");
return 1;
}
ret = getJieCheng(num);
printf("%d! = %llu\n", num, ret);
printf("sizeof(long int) = %zu\n", sizeof(long int));
return 0;
}