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位的整数进行重新组合,生成一个最大数(降序排序),并将最大数返回给主函数。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)