典型的组合问题,解法有递归、回溯等等
递归法较简单,代码如下:
void combine(int a[], int n, int m, int b[], int M);
参数:
a 存放候选数字
n 总项数
m 取出项数
b 存放选出结果
M = m
#include "stdio.h"
#define MAX 100
void combine(int a[], int n, int m, int b[], int M);
int main(void)
{
int i;
int a[MAX], b[MAX];
for (i = 1; i < 100; i++)
a[i - 1] = i;
combine(a, 5, 4, b, 4);
}
void combine(int a[], int n, int m, int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
for (j = M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
其他方法可查阅相关资料。
因为是手动输入,你就将程序简化为:输入几个数,如2,8,10,然后输出所有组合。然后给简化部分增加判断的部分,判断手动输入的那几个数是不是在第一次输入的数里边,并作出错处理!这样就简单多了
抱歉 我帮你想了一个循环的算法 但是由于你要的是手动输入提取数的个数 由于事先无法确定循环的层数 所以我搞不定 实在抱歉 但是如果N是确定话 那么就可以解决了 就是多加几层循环嵌套而已
没能帮到你 真的很遗憾
请搜索一下“C语言动态数组”或“C语言动态内存分配”