C/C++知识点之c语言实现排列组合
小标 2018-09-18 来源 : 阅读 1279 评论 0

摘要:本文主要向大家介绍了C/C++知识点之c语言实现排列组合,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之c语言实现排列组合,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

1.求排列组合结果总数
    组合:采用递归算法,根据下面第二行公式。
     

int sumzuhe(int N, int K)
{
    if (K == 0)
        return 1;
    if (N == K)
        return 1;
    return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);
}

    排列:采用递归。思想来自:https://blog.csdn.net/u012814856/article/details/73863086。

int sumpailie(int N,int K)
{
    if (K ==1)
        return N;
    return  sumpailie(N - 1, K - 1)*N;

}

2.展示排列,组合结果。
    排列:首先从(N)个中取一个数,再在剩余的一次次取一个数,每取一个数就把这位标记为取过了,以免下次再取。取够K个数之后,把K个数输出,展示结果(所以需要提前有一个数组来存                 放结果)。然后再取寻找别的第K个数,依次在不断寻找别的第(K-1),(K-2),,,,,个数。取完一个数把标记位设为未取过。

void  pailie(int a[],int N,int K,int level)//(K==N)时为全排列
{
    if (level>=K)
    { 
        for (int j = 0; j < level; j++)
            printf("%d ", result[j]);
        printf("\n");
        return;
    }
    for (int i = 0; i < N; i++)
    {
        if (flag[i] == false)//该位未取过
        {
            flag[i] = true;
            result[level++] = a[i];//取出修改标记位
            pailie(a, N, K , level);//在未被使用过的里面再选择一个
            level--;//重新取别的位
            flag[i] = false;
        }
    }
}

 
       组合:组合与排列不同的是:不分顺序。我们可以假设一直是从前往后选数,那么前面作为开头的数,后面就不可以再作为开头。比如:A,B,C,D。当我第一次选择第一个数为A的话,把以A为头的数选完之后,下一次选第一个数决不能是A。所以需要有一个变量来控制所选择的第一个数(下面的程序为Index)。然后再在第一个数(比如选择A)之后的数中挑选接下来的数。选择接下来的数与上面排列类似。

void  zuhe(int a[], int N, int K,int index,int deep)
{
    if (deep >= K)
    {
        for (int i = 0; i < K; i++)
        {
            printf("%d ", result[i]);
        }
        printf("\n");
        return;
    }
    for (int i = index; i <N; i++)
    {
        result[deep] = a[i];
        deep++;
        zuhe(a, N, K, index + 1, deep);
        deep--;
        index++;
    }
}

完整程序:

#include "stdio.h"
#define Max  10
#define length 10
typedef enum bool{ true,false}bool;
char flag[10] ;
int  result[10];
int sumzuhe(int N, int K)
{
 if (K == 0)
  return 1;
 if (N == K)
  return 1;
 return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);
}
void  pailie(int a[],int N,int K,int level)
{
     if (level>=K)
        { 
  for (int j = 0; j < level; j++)
   printf("%d ", result[j]);
  printf("\n");
  return;
 }
 for (int i = 0; i < N; i++)
 {
  if (flag[i] == false)
  {
   flag[i] = true;
   result[level++] = a[i];
   pailie(a, N, K , level);//在未被使用过的里面再选择一个
   level--;
   flag[i] = false;
  }
 }
}
void  zuhe(int a[], int N, int K,int index,int deep)
{
 if (deep >= K)
 {
  for (int i = 0; i < K; i++)
  {
   printf("%d ", result[i]);
  }
  printf("\n");
  return;
 }
 for (int i = index; i <N; i++)
 {
  result[deep] = a[i];
  deep++;
  zuhe(a, N, K, index + 1, deep);
  deep--;
  index++;

 }
}

int sumpailie(int N,int K)
{
 if (K ==1)
  return N;
 return sumpailie(N - 1, K - 1)*N;

}
void main()
{
 int a[5] = { 1,2,3,4,5};
 memset(flag, false, sizeof(flag));
 printf("排列结果数(5,3):\n");
 printf("%d ", sumpailie(5, 3));
 printf("\n");
 printf("排列结果(5,3):\n");
 pailie(a, 5, 3, 0);
 printf("全排列结果:\n");
 pailie(a, 5, 5, 0);

 printf("组合结果数(5,3):\n");
 printf("%d ", sumzuhe(5, 3));
 printf("\n");
 printf("组合结果(5,3):\n");
 zuhe(a, 5, 3, 0, 0);
 printf("\n");
 
}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程