当前位置:首页 » 编程语言 » c语言组合

c语言组合

发布时间: 2022-08-14 21:20:21

c语言求组合数

doublefact(longnum)
{
for(longi=1;num>0;num--)
{
i*=num;
}
}

intmain()
{
longm;
longn;
longC;

scanf("%ld%ld",&m,&n);

C=fact(n)/((fact(m))*fact(n-m));

printf("%ld",C);

return0;
}

⑵ 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;}
以上回答你满意么?

⑶ 在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的全排列。

(3)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语言 排列组合

发个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语言 排列组合

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语言中组合公式的编程

int function(int n,int m)
{
int i, ret = 1;

for(i=0;i<m;i++)
ret *= (n-i);
return ret;
}

void main(void)
{
int n = 15, m =5;
int ret;

ret = function(15,5) / function(5,5);
printf("%d\n",ret);
}

⑺ 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语言从n个数中选m个数的组合

#include<stdio.h>

unsignedlongfactorial(intn);
unsignedlongcombination(intn,intm);
intmain(){
intn,m;
scanf("%d%d",&n,&m);
printf("combination(%d,%d)=%u ",n,m,combination(n,m));
return0;
}

unsignedlongcombination(intn,intm){
unsignedlongres=1;
res=factorial(n)/((factorial(n-m)*factorial(m)));
returnres;
}

unsignedlongfactorial(intn){
inti;
unsignedlongf=1;
for(i=1;i<=n;i++)
f*=i;
returnf;
}

⑼ C语言如何实现任意数全组合

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

#define M 10

int main()
{
int nums[M] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},i;
srand((unsigned)time(0));
for(i=1;i<=6;i++)
{
printf("%d", nums[rand()%M]);
}
getch();
}
说明一下:M是指定的数的个数,nums[]存放需要的数
你只要一运行就可以随机抽取1-10的数字了,只要你有足够的空间存放

⑽ C语言中怎么组合新数字

C语言中组合新数字的方法:定义一个大一点的数组,然后把所有的数组循环赋值给你定义的这个数组就行了啊,只不过是大的这个数组的下标一直往上加。

#include<stdio.h>

int main()

{

int x[200];

int a[20],b[20],c[20];

int i=0,j;

for(j=0;j<20;j++)

x[i++]=a[j];

for(j=0;j<20;j++)

x[i++]=b[j];

for(j=0;j<20;j++)

x[i++]=c[j];

return 0;

}

其他位运算符:

1、按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

2、按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

3、求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

热点内容
数据库中已存在 发布:2025-01-20 15:35:44 浏览:109
压缩超过密度 发布:2025-01-20 15:35:33 浏览:647
和她在一起的日历怎么弄安卓 发布:2025-01-20 15:29:29 浏览:639
android6华为 发布:2025-01-20 15:28:06 浏览:692
荔枝fm怎么上传录音 发布:2025-01-20 15:22:27 浏览:107
马3智雅版有哪些配置 发布:2025-01-20 15:03:06 浏览:362
离心机编程 发布:2025-01-20 15:02:24 浏览:945
按键的汇编程序程序 发布:2025-01-20 15:01:04 浏览:555
linux有哪些系统 发布:2025-01-20 14:53:38 浏览:90
android显示当前时间 发布:2025-01-20 14:53:29 浏览:968