C语言中排列与组合区别是什么

C语言中排列与组合区别是什么,第1张

C(组合)与A(排列)最本质的区别在于对取出的元素是否进行排序或者说有顺序要求。A即所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。C即组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。

排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。

组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。

扩展资料:

排列组合基本计数原理

一、加法原理和分类计数法

⒈加法原理:做一件事,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法……在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+m3+…+mn种不同方法。

⒉第一类办法的方法属于集合A1,第二类办法的方法属于集合A2……第n类办法的方法属于集合An,那么完成这件事的方法属于集合A1UA2U…UAn。

⒊分类的要求 :每一类中的每一种方法都可以独立地完成此任务;两类不同办法中的具体方法,互不相同(即分类不重);完成此任务的任何一种方法,都属于某一类(即分类不漏)。

二、乘法原理和分步计数法

⒈ 乘法原理:做一件事,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2种不同的方法……做第n步有mn种不同的方法,那么完成这件事共有N=m1×m2×m3×…×mn种不同的方法。

⒉合理分步的要求:任何一步的一种方法都不能完成此任务,必须且只须连续完成这n步才能完成此任务;各步计数相互独立;只要有一步中所采取的方法不同,则对应的完成此事的方法也不同。

3与后来的离散型随机变量也有密切相关。

参考资料来源:百度百科-排列组合

我给你一个简单的程序,你可根据自己的情况,更改优化。

#include "iostreamh"

#include "stdioh"

#define NUM_MAX 6

#define COMB_MAX 20

#define MEM_MAX 3

int main()

{

char buf[NUM_MAX];

char comb[COMB_MAX][MEM_MAX];

char ch_p;

int i,j,k,c;

cin >> buf;

c = 0;

for (i=0;i<NUM_MAX-MEM_MAX+1;i++)

for (j=i+1;j<NUM_MAX-MEM_MAX+2;j++)

for (k=j+1;k<NUM_MAX-MEM_MAX+3;k++)

{

comb[c][0] = buf[i];

comb[c][1] = buf[j];

comb[c][2] = buf[k];

c++;

}

for (i=0;i<COMB_MAX;i++)

{

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

printf("%c",comb[i][j]);

printf("\t");

}

}

#include<stdioh>

#define NUM 4 //4位数

void split(int a[],int x)

{

int i;

for(i=0;i<NUM;i++)

{

a[i] = x%10;

x = x/10;

}

}

void sort(int a[])

{

int i;

int j;

for(i=0;i<NUM-1;i++)

{

for(j=i+1;j<NUM;j++)

{

if(a[i]<a[j])

{

int temp =a[i];

a[i] = a[j];

a[j] =temp;

}

}

}

}

int compose(int a[])

{

int i;

int sum=0;

for(i=0;i<NUM;i++)

{

sum = sum10+a[i];

}

return sum;

}

int main()

{

int n;

scanf("%d",&n);

int a[NUM]={0};

split(a,n);

sort(a);

printf("%d",compose(a));

return 0;

}

代码如下:

#include <stdioh>

#include <stdlibh>

int main()

{

short x, y, z;

printf("请输入x y的值:");

scanf("%d%d", &x, &y);

z = (x & 0xff00) | ((y >> 8) & 0x00ff);

printf("z = %d\n", z);

system("pause");

return 0;

}

运行结果:

请先解释需求:

1、什么叫”按照英文句子里的单词顺序进行排序“,参照的是哪个单词?首单词?

2、排序的目标是什么?整条句子么?

3、什么叫”字母顺序相同“?所有字母升序或降序,还是说句子里所有单词首字母相同?

单纯字符串排序(整篇文章就是二维字符数组,一条句子就是一行字符串),用冒泡排序,嵌套循环比较(不满足你所谓的条件)就执行交换,假设两个句子交换位置,就是两个字符串交换,定义一个临时字符数组变量(够大),之后用strcpy函数和这个临时变量进行两个字符串的交换。(strcpy函数在这里相当于一般数值交换的等号)。

这个是排列,如果是组合最后一个循环判断时候有相等的:

#include<stdioh>

int

main()

{

for(int

i0=0;i0<9;i0++)

for(int

i1=0;i1<9;i1++)

for(int

i2=0;i2<9;i2++)

for(int

i3=0;i3<9;i3++)

for(int

i4=0;i4<9;i4++)

for(int

i5=0;i5<9;i5++)

for(int

i6=0;i6<9;i6++)

for(int

i7=0;i7<9;i7++)

for(int

i8=0;i8<9;i8++)

for(int

i9=0;i9<9;i9++)

printf("\n%d%d%d%d%d%d%d%d%d%d",i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);

}

#include <stdioh>

#include <stdlibh>

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");

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", n);

return 0;

}

该程序的输入为一个任意自然数n,将输出从1到n的全排列。

扩展资料:

C语言的基本数的排列法

1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。

#include <stdioh>

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("\n\n");

}

return 0;

}

2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。

#include <stdioh>

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("\n\n");

}

return 0;

}

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语言中排列与组合区别是什么全部的内容,包括:C语言中排列与组合区别是什么、C编写一个全组合程序、用C语言编写程序对1个4位的整数进行重新组合,生成一个最大数(降序排序),并将最大数返回给主函数。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10073336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存