❶ 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);
}
❷ c语言 排列组合 程序算法
#include<stdio.h>
#include<string.h>
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(n>0)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=#//计数器
地址。
p[n]='\0';//这个不用说啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i); return
0;
}
❸ 用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下测试通过。
❹ 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);
}
❺ 有没有C语言大神教教我怎么编排列组合
比较简单的做法是做一个求阶乘的函数fac(n)
然后调用这个函数
C=fac(m)/(fac(n)*fac(m-n))
这个程序的缺点是效率不高,特别是只能求m在12以下的组合数(使用浮点型编写函数可以提高上限)
❻ 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
❼ 用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 ;
}
❽ 在C语言中,如何输出一组数的排列组合
#include <stdio.h>
#include <stdlib.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf(" ");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//输入自然数的个数
printf("请输入连续自然数的个数:");
scanf("%d",&k);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);
return 0;
}
该程序的输入为一个任意自然数n,将输出从1到n的全排列。
(8)排列组合c语言该怎么写扩展阅读:
C语言的基本数的排列法
1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf(" ");
}
return 0;
}
2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}
❾ C语言如何实现任意数排列组合,新手求助,急
求排列组合没有简单方法。方法只有一个,枚举。
有几个位置需要列举,就需要几个循环。如果循环数量太多,可以用函数递归来枚举。
例程:
#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;
}
❿ 用C语言编写一个排列组合的程序
#include<cstdio>看代码,应该好懂的吧
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
usingnamespacestd;
intf[4]={0,1,2,3};
charch[4][10]={"a2b8","5a8f","b9ec","5c2f"};
intmain()
{
inti,j,k;
for(i=0;i<24;i++)//共4!个排列
{
for(j=0;j<4;j++)
printf("%s",ch[f[j]]);
printf(" ");
next_permutation(f,f+4);//下一个排列
}
return0;
}