C语言如何用递归和非递归的方式编写函数,来找出大于1的自然数n的所有质数因子?例如,72的质数因子分解为2*2*2*3*3,请提供详细的实现代码示例。
时间: 2024-11-22 19:47:59 AIGC 浏览: 44
在C语言中,我们可以用递归和非递归的方式来寻找一个数的质数因子。这里我会分别给出这两种方法的代码示例。
**非递归方法**(使用循环和条件判断):
```c
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int num) {
if (num <= 1)
return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0)
return false;
}
return true;
}
void prime_factors(int n, int factor, int result[], int count) {
if (factor > n || !is_prime(factor))
return;
// 将当前质数因子添加到结果数组中,并更新计数器
result[count++] = factor;
n /= factor;
// 继续查找下一个质因数
prime_factors(n, factor + 1, result, count);
}
int main() {
int n = 72;
int factors[100]; // 假设结果最多有100个质因数
int count = 0;
prime_factors(n, 2, factors, count);
printf("Prime factors of %d are: ", n);
for (int i = 0; i < count; i++)
printf("%d ", factors[i]);
return 0;
}
```
**递归方法**:
```c
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int num) {
/* ... (同上) */
}
// 递归版的质因数分解函数
void prime_factors_recursive(int n, int factor, int result[], int &count) {
if (factor > n || !is_prime(factor)) {
return;
}
// 添加质因数
result[count++] = factor;
// 除掉已经提取的质因子
n /= factor;
// 递归继续查找下一个质因数
prime_factors_recursive(n, factor + 1, result, count);
}
int main() {
int n = 72;
int factors[100];
int count = 0;
prime_factors_recursive(n, 2, factors, count);
printf("Prime factors of %d are: ", n);
for (int i = 0; i < count; i++)
printf("%d ", factors[i]);
return 0;
}
```
在这两个例子中,`is_prime()`函数用于检查数字是否为质数,`prime_factors`系列函数则是找到并存储质数因子。非递归版本通过一个循环来逐个尝试质数作为因子,而递归版本则通过不断调用自身直到n变为1为止。
阅读全文
相关推荐



















