c语言 跪求:输入M个数从中取N个数进行组合并输出所有组合项

M、N都是不固定的,例如输入M可以是3、5、9、24也可以是8、4、7、21、6、11,N可以是2也可以是5,当然N<M.(注:要C语言源码,本人只学了C,而且M、N值可... M、N都是不固定的,例如输入M可以是3、5、9、24也可以是8、4、7、21、6、11,N可以是2也可以是5,当然N<M.(注:要C语言源码,本人只学了C,而且M、N值可以随时输入的)本人在百度搜了一整天也没想要的答案,哪位大侠懂得请帮帮忙,灌水勿犹,谢谢~!
不是随机取,是手动输入,例如,手动输入4个数:3、5、9、24取其中2个数进行组合,如3-5 3-9 3-24 5-9等等输出所有组合项;又如手动输入6个数4、7、9、12、1、2取其中3个数进行组合,如4-7-9 4-7-12等等输出所有组合项。输入的数与个数不定
展开
 我来答
poseidon_k
推荐于2017-11-28 · TA获得超过2580个赞
知道小有建树答主
回答量:1223
采纳率:0%
帮助的人:309万
展开全部
典型的组合问题,解法有递归、回溯等等
递归法较简单,代码如下:

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");
}
}
}

其他方法可查阅相关资料。
更多追问追答
追问
源码运行结果:
5 4 3 2
5 4 3 1
5 4 2 1
5 3 2 1
4 3 2 1
请按任意键继续. . .
虽然也是输出组合,可是输入的数不一定是1、2、3、4、5,取出的数也不一定是4个啊!不过还是谢谢你!我要个具有普遍性、实用性的,而不是仅仅对1 2 3 4 5进行组合
追答
源码里数组a是从1到100,你可以根据自己的需要传入其他的数组啊。
zx956592819
2012-10-13 · 超过20用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:48万
展开全部
因为是手动输入,你就将程序简化为:输入几个数,如2,8,10,然后输出所有组合。然后给简化部分增加判断的部分,判断手动输入的那几个数是不是在第一次输入的数里边,并作出错处理!这样就简单多了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
惟爱崔
2012-10-13 · 超过17用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:42.2万
展开全部
抱歉 我帮你想了一个循环的算法 但是由于你要的是手动输入提取数的个数 由于事先无法确定循环的层数 所以我搞不定 实在抱歉 但是如果N是确定话 那么就可以解决了 就是多加几层循环嵌套而已
没能帮到你 真的很遗憾
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Shuang784
2012-10-13 · 超过55用户采纳过TA的回答
知道答主
回答量:153
采纳率:0%
帮助的人:156万
展开全部
请搜索一下“C语言动态数组”或“C语言动态内存分配”
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式