当前位置:首页 » 编程语言 » c语言怎么用排列组合
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言怎么用排列组合

发布时间: 2022-04-18 21:11:29

1. 在c语言中怎么设计排列组合的算法呢(请勿百度算法给我谢谢,我想知道怎么想得到这个算法)谢谢!

采用递归思路:假设有A1,A2,A3...An种元素
排列:
(1)把所有元素作为一个集合,可以拆分为一个元素+剩余元素的子集合,有n种拆法(A1/剩余元素,A2/剩余元素...An/剩余元素)
(2)把第一步中的子集合,按照(1)的思路进一步拆分,直到满足(3)
(3)当子集合中只有1种元素时,此时为Ax/Ay,排列就只有两种:Ax+Ay和Ay+Ax

组合:计算出排列后,组合就是:判断新生成的排列方案与之前的排列方案是否为同一种组合,比如Ax+Ay与Ay+Ax是不同的排列、是相同的组合

2. c语言 排列组合 程序算法

void Show(int n,int len ,char str[], char p[],int *i){/*函数功能说明: 密码穷举法 递归算法参数说明:len 密码可选元素的个数,实际等于 strlen(str); n 密码位数。 STR[]密码表。 *p 密码排列组合的临时存档*/int a;n--;for(a=0; a < len; a++){p[n]=str[a]; if(n==0)printf("%d:%s ",(*i)++,p); if(n0)Show(n,len , str,p,i);}} /*驱动程序 用于测试*/ int main(void){char str[]="abcdef";//密码表 可选元素集合可根据选择修改 int n=4;//密码位数,根据具体应用而定。 int len=strlen(str);//用于密码元素集合计数。 char p[20];//存放排列组合的密码,用于输出。 int num=0;//存放统计个数的整数值, int *i=&num;//计数器 地址。 p[n]='\0';//这个不用说啦。 printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}

3. C语言 排列组合

发个C#的代码:

int[] a = { 1 , 2 , 3 , 4 , 5 , 6 };
int weishu = 6;

int weishu2 = weishu - 1;
int zuida = (int)Math.Pow( 2 , weishu2 );
List<int[]> list = new List<int[]>();
for ( int i = 0 ; i < zuida ; i++ )
{
int[] b = (int[])a.Clone();
for ( int j = 0 ; j < weishu2 ; j++ )
{
int c = i >> j;
if ( (c & 1) == 1 )
{
int tmp = b[ j ];
b[ j ] = b[ j + 1 ];
b[ j + 1 ] = tmp;
}
}
list.Add( b );
}

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine( string.Format( "共 {0} 个结果" , list.Count ) );
foreach ( int[] aa in list )
{
for ( int i = 0 ; i < aa.Length ; i++ )
{
sb.Append( aa[ i ] );
if ( (i & 1) == 1 )
sb.Append( '\t' );
}
sb.AppendLine();
}
Console.WriteLine( sb.ToString() );

运行结果:

共 32 个结果
12 34 56
21 34 56
13 24 56
23 14 56
12 43 56
21 43 56
13 42 56
23 41 56
12 35 46
21 35 46
13 25 46
23 15 46
12 45 36
21 45 36
13 45 26
23 45 16
12 34 65
21 34 65
13 24 65
23 14 65
12 43 65
21 43 65
13 42 65
23 41 65
12 35 64
21 35 64
13 25 64
23 15 64
12 45 63
21 45 63
13 45 62
23 45 61

4. c语言如何实现排列组合的程序

void nn(char c,char cc[])
{//对于有重复的数据这就不行了
//虽然可以都列出来,中间有重复的可能
char tmp,*qc;
if(c=='#')printf("%s",cc);
else {
for(qc=c;qc!='#';qc++){
tmp=*c;
*c=*qc;
*qc=tmp;
cc++;
nn(qc,cc);
cc--;
tmp=*c;
*c=*qc;
*qc=tmp;
}
}
}
main()
{

char cc[100];//请以#结束
scanf("%s",&cc);
nn(cc,cc);

}

5. 用c语言怎么实现排列组合啊比如从100个数里面任意选出5个数,即C100 5……

#include<stdio.h>
void main()
{
int n = 100;
int m = 5;
int n1 = 1, m1 = 1;
for(int i = 1; i <= m; i++)
{
n1 *= n - i + 1;
m1 *= i;
}
n1 = n1/m1;
printf("C100 5 = %d\n",n1);
}
从n中选出m个,只要改变n和m的值即可,VS2010下测试通过。

6. C语言如何实现任意数排列组合,新手求助,急

  1. 求排列组合没有简单方法。方法只有一个,枚举。

  2. 有几个位置需要列举,就需要几个循环。如果循环数量太多,可以用函数递归来枚举。

    例程:

    #include<stdio.h>
    intmain(){
    inta[4]={1,3,4,7};//第一个位置
    intb[4]={2,5,8,10};//第二个位置
    intc[4]={6,9,11,12};//第三个位置
    inti,j,k;
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    for(k=0;k<4;k++)
    printf("%d%d%d ,",a[i],b[j],c[k]);//输出一种排列
    getch();
    return0;
    }

7. 用C语言编写一个排列组合的程序

#include<stdio.h>

int a[5];
int len1,len2,len3;

void input(int len1,int len2,int len3)
{
printf("%d %d %d\n",a[len1],a[len2],a[len3]);
}

void solve(int len1,int len2,int len3)
{
input(len1,len2,len3);
if(len1==2) return;
if(len3<4) len3++;
else if(len2<3)
{
len2++;
len3=len2+1;
}
else if(len1<2)
{
len1++;
len2=len1+1;
len3=len2+1;
}
solve(len1,len2,len3);
}

void main()
{
int i;
for(i=0;i<5;i++) a[i]=i+1;
printf("所构成组合是:\n");
solve(0,1,2);
return ;
}

8. c语言 排列组合

22个汉字全排列

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

#define ISPRINT
#define MAX 100

unsigned int *_NUM;
char *_NUMFLAG;

#define NUM(j) (*(_NUM+(j)))
#define NUMFLAG(j) (*(_NUMFLAG+(j)))
#define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j)))))

void main()
{
char s[22][3] = {"想","恨","忍","真","我","爱","你","情","没","今","世","一","在","生","活","为","有","乐","好","不","快","过"};
unsigned int number = 3,j;
int i;

_NUM=(unsigned int*)malloc(sizeof(unsigned int)*number);
if(!_NUM){puts("alloc memory error.");exit(-1);}
_NUMFLAG=(char*)malloc(sizeof(char)*number);
if(!_NUMFLAG){puts("alloc memory error.");exit(-1);}

for(i=0;i<number;i++)NUM(i)=i,NUMFLAG(i)=1;

do{

#ifdef ISPRINT
for(j=0;j<number;j++)printf("%s",s[NUM(j)]);
puts("");
#endif

NUMUSE(number-1)=0;

for(i=number-2;i>=0;i--){
NUMUSE(i)=0;
if(NUM(i)<NUM(i+1))break;
}

if(i<0)break;

for(j=NUM(i)+1;j<number;j++){
if(!NUMFLAG(j))break;
}

NUMFLAG(j)=1;
NUM(i)=j;

for(j=0,i++;i<number;j++)
if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1;
}while(1);

free(_NUM);
free(_NUMFLAG);

}

9. c语言编程排列组合

void Show(int n,int len ,char str[], char p[],int *i){/*函数功能说明: 密码穷举法 递归算法参数说明:len 密码可选元素的个数,实际等于 strlen(str); n 密码位数。 STR[]密码表。 *p 密码排列组合的临时存档*/int a;n--;for(a=0; a < len; a++){p[n]=str[a]; if(n==0)printf("%d:%s ",(*i)++,p); if(n0)Show(n,len , str,p,i);}} /*驱动程序 用于测试*/ int main(void){char str[]="abcdef";//密码表 可选元素集合可根据选择修改 int n=4;//密码位数,根据具体应用而定。 int len=strlen(str);//用于密码元素集合计数。 char p[20];//存放排列组合的密码,用于输出。 int num=0;//存放统计个数的整数值, int *i=&num;//计数器 地址。 p[n]='\0';//这个不用说啦。 printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}
以上回答你满意么?