在编程领域,阶乘是一个常见的数学概念,特别是在算法和计算机科学竞赛中,如ACM(国际大学生程序设计竞赛)。阶乘表示的是一个正整数N的所有小于等于它的正整数的乘积,表示为N!。例如,5的阶乘(5!)是5 × 4 × 3 × 2 × 1 = 120。
本篇内容主要讨论如何使用C语言计算一个正整数的阶乘。有两种常见的方法:递归和迭代。
1. **递归法**:
递归是一种函数在其定义中调用自身的技术。在C语言中实现阶乘的递归方法如下:
```c
long factorial(int n) {
if(n == 1)
return 1;
else
return n * factorial(n-1);
}
```
这里,函数`factorial()`在n等于1时停止递归(边界条件),并返回1。否则,它将调用自身来计算n-1的阶乘,然后乘以n。递归的关键在于每个递归调用都会导致规模更小的问题,直到达到基础情况(这里是n=1)。
2. **迭代法**:
另一种方法是使用循环来逐步累积结果,这通常比递归更高效,因为它避免了重复的函数调用。
```c
long iterativeFactorial(int n) {
long result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
```
在这个例子中,我们初始化结果为1,然后通过一个for循环将1到n的所有数字相乘。
文章中还提供了一个ACM题目示例,要求输入一个正整数N,输出N的阶乘。在处理这个问题时,我们需要确保输入在0到1000的范围内,以防止溢出。给出的AC代码使用迭代方法来计算阶乘,它使用一个字符数组`str`来存储中间结果,因为阶乘可能会非常大,超过了整数类型所能表示的范围。
```c
void calculateFactorial(int n) {
int i, j, temp, c, len;
memset(str, 0, sizeof(str));
str[1] = 1;
for (i = 2, len = 1; i <= n; i ++) {
for (j = 1, c = 0; j <= len; j ++) {
temp = str[j] * i + c;
str[j] = temp % 10;
c = temp / 10;
}
while(c > 0) {
str[j++] = c % 10;
c /= 10;
}
len = j - 1;
}
for (i = len; i >= 1; i --) {
printf("%d", str[i]);
}
printf("\n");
}
```
这段代码首先清零数组`str`,然后逐个将2到n的数字与当前`str`表示的数相乘,将结果存储回`str`。它倒序打印`str`的内容以得到阶乘的值。
在实际编程中,理解并能正确地实现递归和迭代方法是至关重要的,特别是在处理计算密集型问题时。同时,考虑到效率和资源限制,选择合适的方法对解决问题至关重要。
- 1
- 2
前往页