出道又简单也不怎么简单的题目,大家有兴趣讨论一下啊哈哈,就是排列组合啦。
输入n(0<n<12)
对字符串s="ABCDEFGHIJKL";
(1)前n个字符作全排列,按(字典)顺序输出。
比如:n=3时
ABC
ACB
BAC
BCA
CAB
CBA
共有n!个
(2)前n个字符作全组合,按顺序输出。
A
B
C
AB
AC
BC
ABC
共有2^n-1个。
另一种顺序:
A
B
AB
C
AC
BC
ABC
另一种顺序(实现方法):
输入n(0<n<12)
对字符串s="ABCDEFGHIJKL";
(1)前n个字符作全排列,按(字典)顺序输出。
比如:n=3时
ABC
ACB
BAC
BCA
CAB
CBA
共有n!个
(2)前n个字符作全组合,按顺序输出。
A
B
C
AB
AC
BC
ABC
共有2^n-1个。
另一种顺序:
A
B
AB
C
AC
BC
ABC
不知道看明白没有。 下面是我以前写的代码:
全排列:
#include<stdio.h>
#include<string.h>
char s[]="abcdefghi",ch; //ch为字符交换临时变量
int len; //字符串长度
//以上变量定义为全局变量,因为要参与子函数运算
int x(i,k){ //递归函数,核心代码
if(i<len-1) x(i+1,len-1);
else {
printf("%s\n",s); //显示字符串
return 0;
}
if(i<k){
ch=s[i];
s[i]=s[k]; //交换第i,k个字符
s[k]=ch;
strrev(s+i+1); //把递i个之后的字符串逆序排列
k--;
x(i,k);
return 0;
}
}
int main(){ //主函数
int i=0,k; //i,k可是说是两个指针吧,i初始状态指向第一个字符
len=strlen(s); //len得到字符串长度
k=len-1; //k指向最后一个字符
x(i,k); //调用子函数,充分利用了局部变量不被子函数改变的性质
return 0;
}
#include<string.h>
char s[]="abcdefghi",ch; //ch为字符交换临时变量
int len; //字符串长度
//以上变量定义为全局变量,因为要参与子函数运算
int x(i,k){ //递归函数,核心代码
if(i<len-1) x(i+1,len-1);
else {
printf("%s\n",s); //显示字符串
return 0;
}
if(i<k){
ch=s[i];
s[i]=s[k]; //交换第i,k个字符
s[k]=ch;
strrev(s+i+1); //把递i个之后的字符串逆序排列
k--;
x(i,k);
return 0;
}
}
int main(){ //主函数
int i=0,k; //i,k可是说是两个指针吧,i初始状态指向第一个字符
len=strlen(s); //len得到字符串长度
k=len-1; //k指向最后一个字符
x(i,k); //调用子函数,充分利用了局部变量不被子函数改变的性质
return 0;
}
全组合:(数字代替字母了)
#include<stdio.h>
int n,p=1,s[100]={0};
void R(int j,int i)
{
int k;
if(i==0)
{
for(k=1;k<p-1;k++)
printf("%d ",s[k]);
printf("%d\n",s[k]);
}
else
{
for(k=j;k<=n+1-i;k++)
{
s[p++]=k;
R(k+1,i-1);
p--;
}
}
return ;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++) R(1,i);
return 0;
}
int n,p=1,s[100]={0};
void R(int j,int i)
{
int k;
if(i==0)
{
for(k=1;k<p-1;k++)
printf("%d ",s[k]);
printf("%d\n",s[k]);
}
else
{
for(k=j;k<=n+1-i;k++)
{
s[p++]=k;
R(k+1,i-1);
p--;
}
}
return ;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++) R(1,i);
return 0;
}
另一种顺序(实现方法):
#include<stdio.h>
int main()
{
int i,j,x=1,n;
scanf("%d",&n);
x<<=n;
for(i=1;i<x;i++)
{
for(j=0;j<n;j++)
{
if((1<<j)&i)
printf("%d ",j+1);
}
printf("\n");
}
return 0;
}
int main()
{
int i,j,x=1,n;
scanf("%d",&n);
x<<=n;
for(i=1;i<x;i++)
{
for(j=0;j<n;j++)
{
if((1<<j)&i)
printf("%d ",j+1);
}
printf("\n");
}
return 0;
}