输出n个自然数(1,2,3,…,n)中r个数的所有组合。 输入:有两个数,第一个是n,第二个是r 输出:所有的组合 c语言
时间: 2024-09-29 16:04:01 浏览: 38
在C语言中,你可以使用递归回溯算法(也称为“深度优先搜索”)来生成从1到n中取r个数的所有组合。下面是一个简单的示例程序,它使用了`#include <stdio.h>` 和 `#include <stdlib.h>` 来实现这个功能:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX 100 // 根据需要调整最大数字n值
void combination(int n, int r, int start[], int index) {
if (index == r) { // 如果已选择r个元素,则打印组合并返回
for (int i = 0; i < r; i++) {
printf("%d", start[i] + 1);
if (i != r - 1)
printf(", ");
}
printf("\n");
return;
}
for (int i = start; i <= n; i++) {
start[index] = i; // 将当前元素添加到组合中
combination(n, r, start, index + 1); // 继续选择下一个元素
}
}
int main() {
int n, r;
printf("请输入n(范围:1 到 %d): ", MAX);
scanf("%d", &n);
if (n < 1 || n > MAX) {
printf("错误:n应小于等于%d。\n", MAX);
return 1;
}
printf("请输入r: ");
scanf("%d", &r);
if (r > n) {
printf("错误:r应小于等于n。\n");
return 1;
}
int* arr = (int*)malloc(r * sizeof(int)); // 初始化数组存储结果
combination(n, r, arr, 0); // 开始生成组合
free(arr); // 释放内存
return 0;
}
```
运行此程序时,首先输入n和r,然后会输出所有从1到n中选取r个数的组合。注意这个程序假设n和r都是较小的,对于较大的值可能会有性能问题。此外,组合的数量增长非常快,如果r接近n,结果将非常多,所以请谨慎使用。
阅读全文