首页 > 编程笔记

C语言排列与组合(附带示例)

所谓排列,就是从给定个数的元素中取出指定个数的元素进行排序。所谓组合,则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。

排列组合的中心问题是研究给定要求的排列和组合可能出现情况的总数。

C语言排列的定义

从 N 个不同元素中,任取 M(M≤N) 个元素按照一定的顺序排成一列,叫作从 N 个不同元素中取出 M 个元素的一个排列,所有排列的个数叫作排列数,用符号 P(N,M) 表示。

P(N,M)=N(N-1)(N-2)…(N-M+1)=N!/(N-M)!(规定0!=1)

C语言组合的定义

从 N 个不同元素中,任取M(M≤N)个元素并成一组,叫作从 N 个不同元素中取出 M 个元素的一个组合,所有组合的个数叫作组合数,用符号 C(N,M)表示。

C(N,M)=P(N,M)/M!=N!/((N-M)!*M!);C(N,M)=C(N,N-M)

C语言排列与组合应用示例

编一个程序,求出从 N 个元素中取出 M 个元素的所有组合,例如从 3 个元素中取出 2 个元素的所有组合。C语言编程代码如下:
#include<stdio.h>
#define MAX 20                    /*定义宏*/
int c[MAX] = {0};
int p, n;
void print()
{   int a;
    for(a= 0; a < p; a++)
        printf("%d", c[a + 1]);
    printf("\n");
}
void comp(int m)                   /*定义组合函数*/
{   if (m == p + 1)
        print();
    else
        for(c[m] = c[m - 1] + 1; c[m] <= n - p + m; c[m]++)
            comp(m + 1);
}
int main()
{   printf("请分别输入元素n和p:\n");
    scanf("%d %d", &n, &p);         /*输入两个数*/
    printf("%d个元素中取出%d个元素的所有组合如下: \n",n,p);
    comp(1);
    return 0;
}
运行结果:

请分别输入元素n和p:
4 2
4个元素中取出2个元素的所有组合如下:
12
13
14
23
24
34

本例实际上是通过公式 C(N,M)=P(N,M)/M!=N!/((N-M)!*M!),C(N,M)=C(N,N-M) 计算结果的,即 C(4,2)=P(4,2)/2!=4!/((4-2)!*2!)=6,最终输出结果,得到 6 组排列数。

优秀文章