/*算法说明:

问题:现在有n个球,分别编号为1,2,3···n,对这n个球有多少种不重复的排列,列出所有的排列。

解:由数学知识可知:第一个球有n种选择,第二个球有n-1个选择··所以共有n!种选择(乘法法则)

那么1~n!这n!个整数,每个整数则分别对应不同的组合。

比如现在有3个球,编号为1,2,3,那么可以很容易列出所以的组合为:

123

132

213

231

312

321

其中123这种组合就可以编号为组合1,132这种组合就可以编号为组合2·····,321这种组合就可以编号为组合6,如果要问此时组合4是什么可以很容易查到为:231

那么对于n个球,只要给出一个1~n之间的整数,这个整数就对应着一种组合,那么如何找出这个组合呢,其通用算法又是什么呢?

比方说现在有4个球,问组合16是什么组合的话,可以这样算:

---------

16-1=15

建立一个数组a[0]=1,a[1]=2,a[2]=3,a[3]=4, 然后15/(4-1)!=15/3!=15/6=2```3,商为2,a[2]=3,所以组合的第一个数为a[2]=3

然后将a[2]后面的数都往前面移动,数组变为a[0]=1,a[1]=2,a[2]=4,a[3]=4,余数为3,3/2!=1```1,商为1,a[1]=2,所以组合第二个数为2,然后

数组a[1]后面的数往前移动,数组为a[0]=1,a[1]=4,a[2]=4,a[3]=4,

余数1/1!=1```0,商为1,a[1]=4,所以组合第三个数为a[1]=4,a[1]后面的数字往前移动变为a[0]=1,a[1]=4,a[2]=4,a[3]=4

余数0/0!=0```0,商为0,a[0]=1,所以组合第四个数为1

综合起来为3241

----------

用这种算法可以轻松找出n个球情况下编号为x对应的组合情况*/

#include

#include

#include

int Factorial(int n)//求阶乘函数{

if(n==1) return 1;

else if(n==0) return 1;

else return n*Factorial(n-1);

}

void printout(int index,int n,int *array)//对于n个球,打印出编号为index的排列组合出来{

for(int i=0;i

array[i]=i+1;

}

int divide,left,*out;//divide 为index除某数的商,left为余数 printf("序号:%-3d |",index);

out=(int *)malloc(sizeof(int)*n);//out为用来储存排列排列组合的数组,有n个球所以有n个数 index=index-1;//----------------------------------------------------------- for(i=n-1;i>=0;i--)

{

divide=index/Factorial(i);

left=index%Factorial(i);

out[n-1-i]=array[divide]; //见算法说明 for(int i2=divide;i2

{

array[i2]=array[i2+1];

}

index=left;

}//------------------------------------------------------------------------ for(i=0;i

{

printf("%d",out[i]);//输出排列组合 }

free(out);//释放out占的内存 printf("\n");

}

void main()

{

int n,index=1;

printf("输入球的个数:");

scanf("%d",&n);

int *array;

array=(int*)malloc(sizeof(int)*n);

int fac=Factorial(n);//对于n个球一共有n!种排列组合情况 for(index=1;index<=fac;index++)

{

printout(index,n,array);//每一种排列组合,都有一个对应的编号,对所有编号遍历输出 }

getch();

}

三个字母排列组合c语言,n个球的排列组合算法相关推荐

  1. C语言向右移三个字母怎么做,c语言左移和右移的示例详解

    逻辑移位,简单理解就是物理上按位进行的左右移动,两头用0进行补充,不关心数值的符号问题. 算术移位,同样也是物理上按位进行的左右移动,两头用0进行补充,但必须确保符号位不改变. 算术移位指令 算术移位 ...

  2. c语言三个字母比较大小,C语言stricmp()函数:比较两个字符串大小

    函数名: stricmp 头文件: 函数原型: int stricmp(const char *str1, const char *str2); 功 能: 比较两个字符串大小,但不区分大小写 参 数: ...

  3. C语言打印字符串的所有排列组合(附完整源码)

    C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...

  4. 用c语言实现字母排列组合,C语言字母排列组合的实现.pdf

    C语言字母排列组合的实现 曹玉坤 2011-6-21 目录 概述3 需求3 规律3 实现算法5 难点6 代码6 概述 本文档概述字母排列组合的实现算法和分析过程,着重强调在 解决问题前,对问题的思考方 ...

  5. 用c语言实现字母排列组合,C语言字母排列组合的实现.doc

    C语言字母排列组合的实现.doc C语言字母排列组合的实现曹玉坤2011-6-21目录概述3需求3规律3实现算法5难点6代码6概述 本文档概述字母排列组合的实现算法和分析过程,着重强调在解决问题前,对 ...

  6. 语言 全排列 函数_【排列组合】错位全排列的简化计算公式

    一.错位全排列问题 什么是错位全排列问题?其实很简单,在生活中可能都会遇到: "装错信封问题"是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-174 ...

  7. iso国家代码 三位字母_ISO 2字母语言代码

    iso国家代码 三位字母 The codes below, which are sorted alphabetically by language (not language code) are to ...

  8. R语言使用choose函数计算排列组合:组合数(输入两个参数、combination)

    R语言使用choose函数计算排列组合:组合数(输入两个参数.combination) 目录 R语言使用choose函数计算组合数(输入两个参数.combination) R 语言特点 R语言使用ch ...

  9. LeetCode242/567.字符串的排列:有效的字母异位词(Kotlin语言)

    LeetCode242.有效的字母异位词 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram" ...

最新文章

  1. Java架构-薪水增长多少,新机会才值得考虑?
  2. VB 宏+mysql解决EXCEL表格实现自动化处理
  3. 万年历升级版 Calendar
  4. oracle自定义函数获取省份,Oracle 自定义函数Function
  5. mysql 授权 navicat的登录数据库
  6. 阿里云服务器搭建 Redis 集群
  7. 乙酸乙酯密度是多少 乙酸乙酯的用途
  8. 备战金九银十 你必须知道的Mybatis面试题
  9. 2020年4大安全会议及论文
  10. Java字节码编程之非常好用的javassist
  11. 绘一幅人人出彩的教育画卷
  12. 田颖- 「柴姐ye话」主笔,拉链互动副总裁 | 到「在行」来约见我
  13. [ACNOI2022]Bitset Dog
  14. 去年写的代码大全笔记(其实是摘记)
  15. 硬盘安装Debian与Xp双系统
  16. [Python3] 线程池的使用
  17. 计算几何 | 一条迟到的基本定理
  18. UIGU源码分析1:EventSystem
  19. 黄金分割率理论--在分析大盘的时候用
  20. 创建文件 c语言,汇编语言CreateFile函数:创建新文件或者打开已有文件

热门文章

  1. 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
  2. 如何进行安全性测试?
  3. 【无标题】 2022年铜陵市外观设计专利申请条件及费用
  4. 股票入门基础知识笔记
  5. Python优雅技巧
  6. Oracle修改数据库db_name
  7. 网络之tcpdump命令
  8. 九度1465:最简真分数
  9. Citus集群拓扑架构介绍
  10. IO流,字节和字符的输入输出