如何编写输出n个元素所有子集的递归函数? http://blog.csdn.net/ohmygirl/article/details/7859497希望对你有帮助 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 仅供参考#include <stdio.h>#include <stdlib.h>#define MAX_NUM 26int comb[MAX_NUM];int c1,c2;void combination(int m,int n) { int i,j; for (i=m;i>=n;i--) { comb[n]=i; /* 选择当前的“头”元素 */ if (n>1) { combination(i-1,n-1); /* 进入下一次更小的组合问题 */ } else { /* 满了需要的组合数,输出 */ for (j=comb[0];j>0;j--) printf("%c",'A'+c1-comb[j]); printf("\n"); } } return;}int main(int argc,char **argv) { if (argc<3) { printf("%s 组合下标 组合上标\n",argv[0]); return 1; } c1=atoi(argv[1]); if (c1<1 || MAX_NUM<c1) { printf("1<=组合下标<=%d\n",MAX_NUM); return 2; } c2=atoi(argv[2]); if (c2<1 || c1<c2) { printf("1<=组合上标<=组合下标\n"); return 3; } comb[0]=c2; combination(c1,c2); return 0;} 你好!我将你的代码改成了C++,结果运行不对,只能输出单个字母的子集,请麻烦指出下是哪儿不对。程序如下:#include <iostream>using namespace std;#define MAX_NUM 26int comb[MAX_NUM];int c1, c2;void combination(int m, int n) { int i, j; for (i = m; i >= n; i--) { comb[n] = i; /* 选择当前的“头”元素 */ if (n>1) { combination(i - 1, n - 1); /* 进入下一次更小的组合问题 */ } else /* 满了需要的组合数,输出 */ { for (j = comb[0]; j>0; j--) printf("%c", 'A' + c1 - comb[j]); printf("\n"); } } return;}int main(int argc, char **argv) { cout << "输入组合下标(大于等于1,小于等于26):"; cin >> c1; cout << "输入组合上标(大于等于1,小于等于"<<c1<<":"; cin >> c2; comb[0] = c2; combination(c1, c2); system("pause"); return 0;}运行结果截图: #include <stdio.h>#include <stdlib.h>#define MAX_NUM 26int comb[MAX_NUM];int c1,c2;void combination(int m,int n) { int i,j; for (i=m;i>=n;i--) { comb[n]=i; /* 选择当前的“头”元素 */ if (n>1) { combination(i-1,n-1); /* 进入下一次更小的组合问题 */ } else { /* 满了需要的组合数,输出 */ for (j=comb[0];j>0;j--) printf("%c,",'a'+c1-comb[j]); printf("}\n{"); } } return;}int main(int argc,char **argv) { for (c1=1;c1<6;c1++) { printf("-----%d----\n",c1); printf("{}\n{"); for (c2=1;c2<=c1;c2++) { comb[0]=c2; combination(c1,c2); } printf("===========\n"); } return 0;}//-----1----//{}//{a,}//{===========//-----2----//{}//{a,}//{b,}//{a,b,}//{===========//-----3----//{}//{a,}//{b,}//{c,}//{a,b,}//{a,c,}//{b,c,}//{a,b,c,}//{===========//-----4----//{}//{a,}//{b,}//{c,}//{d,}//{a,b,}//{a,c,}//{a,d,}//{b,c,}//{b,d,}//{c,d,}//{a,b,c,}//{a,b,d,}//{a,c,d,}//{b,c,d,}//{a,b,c,d,}//{===========//-----5----//{}//{a,}//{b,}//{c,}//{d,}//{e,}//{a,b,}//{a,c,}//{a,d,}//{a,e,}//{b,c,}//{b,d,}//{b,e,}//{c,d,}//{c,e,}//{d,e,}//{a,b,c,}//{a,b,d,}//{a,b,e,}//{a,c,d,}//{a,c,e,}//{a,d,e,}//{b,c,d,}//{b,c,e,}//{b,d,e,}//{c,d,e,}//{a,b,c,d,}//{a,b,c,e,}//{a,b,d,e,}//{a,c,d,e,}//{b,c,d,e,}//{a,b,c,d,e,}//{===========// 请问如何在线程中显示非模式对话框(关于消息映射) !!如何将DC中的内容与CImage合并,存入Jpeg文件。 急问:如何找到CXXXDlg类的实例对象?? 在线等 打印操作中的问题,请高手指点 如何从一段长字符串中提取自己需要的敏感数据的问题 我想在DIAG上显示一个时钟,用什么样的方法显示比较好? 如何将一个CString的变量转存到一个unsigned short 的数组中去?高手请解答,谢谢(100) 窗口列举的问题,请给点思路 请教几个WIN32 API FUCTION的问题? 为什么写程序时按alt+ctrl+t有时不好用了 mfc对话框快速添加控件快捷键? 主副线程的问题
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m,int n) {
int i,j; for (i=m;i>=n;i--) {
comb[n]=i; /* 选择当前的“头”元素 */
if (n>1) {
combination(i-1,n-1); /* 进入下一次更小的组合问题 */
} else { /* 满了需要的组合数,输出 */
for (j=comb[0];j>0;j--) printf("%c",'A'+c1-comb[j]);
printf("\n");
}
}
return;
}
int main(int argc,char **argv) {
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 1;
}
c1=atoi(argv[1]);
if (c1<1 || MAX_NUM<c1) {
printf("1<=组合下标<=%d\n",MAX_NUM);
return 2;
}
c2=atoi(argv[2]);
if (c2<1 || c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 3;
}
comb[0]=c2;
combination(c1,c2);
return 0;
}
#include <iostream>
using namespace std;#define MAX_NUM 26
int comb[MAX_NUM];
int c1, c2;
void combination(int m, int n)
{
int i, j; for (i = m; i >= n; i--)
{
comb[n] = i; /* 选择当前的“头”元素 */
if (n>1)
{
combination(i - 1, n - 1); /* 进入下一次更小的组合问题 */
}
else /* 满了需要的组合数,输出 */
{
for (j = comb[0]; j>0; j--)
printf("%c", 'A' + c1 - comb[j]); printf("\n");
}
}
return;
}
int main(int argc, char **argv)
{
cout << "输入组合下标(大于等于1,小于等于26):";
cin >> c1;
cout << "输入组合上标(大于等于1,小于等于"<<c1<<":";
cin >> c2; comb[0] = c2;
combination(c1, c2); system("pause");
return 0;
}
运行结果截图:
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m,int n) {
int i,j; for (i=m;i>=n;i--) {
comb[n]=i; /* 选择当前的“头”元素 */
if (n>1) {
combination(i-1,n-1); /* 进入下一次更小的组合问题 */
} else { /* 满了需要的组合数,输出 */
for (j=comb[0];j>0;j--) printf("%c,",'a'+c1-comb[j]);
printf("}\n{");
}
}
return;
}
int main(int argc,char **argv) {
for (c1=1;c1<6;c1++) {
printf("-----%d----\n",c1);
printf("{}\n{");
for (c2=1;c2<=c1;c2++) {
comb[0]=c2;
combination(c1,c2);
}
printf("===========\n");
}
return 0;
}
//-----1----
//{}
//{a,}
//{===========
//-----2----
//{}
//{a,}
//{b,}
//{a,b,}
//{===========
//-----3----
//{}
//{a,}
//{b,}
//{c,}
//{a,b,}
//{a,c,}
//{b,c,}
//{a,b,c,}
//{===========
//-----4----
//{}
//{a,}
//{b,}
//{c,}
//{d,}
//{a,b,}
//{a,c,}
//{a,d,}
//{b,c,}
//{b,d,}
//{c,d,}
//{a,b,c,}
//{a,b,d,}
//{a,c,d,}
//{b,c,d,}
//{a,b,c,d,}
//{===========
//-----5----
//{}
//{a,}
//{b,}
//{c,}
//{d,}
//{e,}
//{a,b,}
//{a,c,}
//{a,d,}
//{a,e,}
//{b,c,}
//{b,d,}
//{b,e,}
//{c,d,}
//{c,e,}
//{d,e,}
//{a,b,c,}
//{a,b,d,}
//{a,b,e,}
//{a,c,d,}
//{a,c,e,}
//{a,d,e,}
//{b,c,d,}
//{b,c,e,}
//{b,d,e,}
//{c,d,e,}
//{a,b,c,d,}
//{a,b,c,e,}
//{a,b,d,e,}
//{a,c,d,e,}
//{b,c,d,e,}
//{a,b,c,d,e,}
//{===========
//