组合问题,输出 n 个数的所有组合

liu_jie_1 2009-05-10 01:57:11
以下是我写的输出四个数字的所有组合,思路是这样的:我先将这四个数字正序排列好,然后按照组合元素个数由 1 个到 4 个 依次将可能的组合输出来。可是大家不难看出我的代码冗余而没有新意,这只是四个数的组合 如果我要求十个数的组合 不可能让我敲十个嵌套循环吧。 谁有更好的办法,请告诉我。最好说的详细一点。先谢谢了。

#include<iostream>
using namespace std;
void arrange(int *x)
{
int t=sizeof(x);
for(int i=0;i<t;i++)
for(int j=i;j<t;j++)
if(x[j]<x[i])
{
int m ;
m=x[i];
x[i]=x[j];
x[j]=m;
}
}

void main()
{
int xx[4]={3,2,1,4};
int *p=xx;
int m=sizeof(p);
// 正序排列xx[4]
arrange(p);
for(int i=0;i<m;i++)
cout<<p[i]<<endl;

for( i=0;i<m;i++)
for(int j=i+1;j<m;j++)
cout<<p[i]<<" "<<p[j]<<endl;

for( i=0;i<m;i++)
for( int j=i+1;j<m;j++)
for(int n=j+1;n<m;n++)
{
cout<<p[i]<<" "<<p[j]<<" "<<p[n]<<endl;
}

for( i=0;i<m;i++)
for(int j=i+1;j<m;j++)
for( int n=j+1;n<m;n++)
for(int x=n+1;x<m;x++)
cout<<p[i]<<" "<<p[j]<<" "<<p[n]<<" "<<p[x]<<endl;


}
...全文
419 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao05050075 2009-05-11
  • 打赏
  • 举报
回复
这个跟单片机几乎没有半点关系。你看一看C语言的位运算就可以了。可能开头会有点难理解
liu_jie_1 2009-05-11
  • 打赏
  • 举报
回复

[Quote=引用 9 楼 liao05050075 的回复:]
用位运算吧。
你看这个:

C/C++ code
#include<iostream>
using namespace std;

void output(int n)
{
int i;
for(i=0;i<4;i++)
if((1<<i)&n) cout<<i+1<<' ';
cout<<endl;
}

int main()
{
int i;
for(i=1;i<(1<<4);i++)
output(i);
return 0;
}
[/Quote]

这个代码是联系到单片机的知识吗? 位运算,我什么时候能到达这种程度啊。
liu_jie_1 2009-05-10
  • 打赏
  • 举报
回复
谢谢大家的支持,关于这个问题我还在研究,从这个问题里面我已经学到了很多的东西。
  • 打赏
  • 举报
回复
想要全排列?
给你个强大的递归实现。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

void swap(char *str1,char *str2)
{
char temp;
temp=*str1;
*str1=*str2;
*str2=temp;
}

void permStr(char *str,int i)
{
//printf("%d",i);
if(i==strlen(str)-1)
printf("%s\n",str);
else
{
for(int j=i;j<strlen(str);j++)
{
//printf("i %d,j %d",i,j);
swap(&str[i],&str[j]);
permStr(str,i+1);
swap(&str[i],&str[j]);
}
}
}

void main()
{
char str[]={"abcde"};

permStr(str,0);

}
lpf000 2009-05-10
  • 打赏
  • 举报
回复
循环吧,不用排序,也不慢吧
hyram 2009-05-10
  • 打赏
  • 举报
回复
递归
zqlong_sunday 2009-05-10
  • 打赏
  • 举报
回复
用递归来解决是比较好的
woshichangjiu 2009-05-10
  • 打赏
  • 举报
回复
直接百度搜索“全排列”,就可以得到几个经典的全排列算法。
koulongfei 2009-05-10
  • 打赏
  • 举报
回复
后面再来学习
liao05050075 2009-05-10
  • 打赏
  • 举报
回复
用位运算吧。
你看这个:

#include<iostream>
using namespace std;

void output(int n)
{
int i;
for(i=0;i<4;i++)
if((1<<i)&n) cout<<i+1<<' ';
cout<<endl;
}

int main()
{
int i;
for(i=1;i<(1<<4);i++)
output(i);
return 0;
}
pathuang68 2009-05-10
  • 打赏
  • 举报
回复
题目有意思,要想做好还是有点难度的,先顶一个
liu_jie_1 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lingyin55 的回复:]
参考这个吧

http://zhidao.baidu.com/question/88456634.html
[/Quote]

正在看你介绍的这个网址中的内容,讲到回溯法了 ,看来我得好好的研究一下。
liu_jie_1 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mengde007 的回复:]
引用 1 楼 liu_jie_1 的回复:
先给自己顶一个

楼主真不厚道;
你随机一下不就好了;如果存在继续随机;
[/Quote]

我不是很相信随机,有时候电脑随机来随机去就那几个数在跳来跳去,而且靠随机的话 这个程序就不稳定了 天知道什么时候才可以把所有的可能全输出来。
liu_jie_1 2009-05-10
  • 打赏
  • 举报
回复
我不是很相信随机,有时候电脑随机来随机去就那几个数在跳来跳去,而且靠随机的话 这个程序就不稳定了 天知道什么时候才可以把所有的可能全输出来。
windsting 2009-05-10
  • 打赏
  • 举报
回复
有兴趣的话,看看这个例子,大体上就是这么回事,只不过例子更复杂一点,
而且需要做一些修改才能达到你的目的,但总的说来思路已经很明显了,
这是我看书上的题目,然后再看答案才弄明白这程序是干什么、怎么做的:


#include <stdlib.h>
#include <stdio.h>


//不得不说,递归真是不太好理解
//或者说我实在对递归掌握的不够
//用排列组合方式列出给定数量字符所能组成的所有回文

int iNum = 0;
void P(char* s,int i,int n)
{
if (i>0)
{
int j;
for (j=i-1;j>0;--j)
putchar(s[j]);
for (j=0;j<i;++j)
putchar(s[j]);
// putchar('\n');
printf("\t%d\n",iNum++);
for (j=i-1;j>=0;--j)
putchar(s[j]);
for (j=0;j<i;++j)
putchar(s[j]);
// putchar('\n');
printf("\t%d\n",iNum++);
}
if (i<n)
{
char c;
for (c='A' ; c<='C' ;++c)
{
i?0:iNum=1;
s[i] = c;
P(s,i+1,n);
}
}

}

int main()
{
char s[3];
P(s,0,3);

return 0;
}
lingyin55 2009-05-10
  • 打赏
  • 举报
回复
mengde007 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liu_jie_1 的回复:]
先给自己顶一个
[/Quote]
楼主真不厚道;
你随机一下不就好了;如果存在继续随机;
liu_jie_1 2009-05-10
  • 打赏
  • 举报
回复
先给自己顶一个

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧