/*
X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!。这就是康托展开。
a[n]代表的是元素所在的排序(从0 开始):
[ABCD]中一个元素串[ACBD]其中A的位置是0,C的位置是剩下的CBD中的第二大元素,故c的位置是1,B的位置是剩下的BD中的第一大元素,故B的位置是0,同理D的位置是0
想知道321是{1,2,3}中第几个大的数可以这样考虑 :
第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。
再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个
。所以321是第6个大的数。 2*2!+1*1!是康托展开。
*/
#include<stdio.h>
#define Max 100
//求阶乘
int factorial_function(int num)
{
if(num <= 1)
return 1;
else
return (factorial_function(num-1)*num);
}
int main()
{
int num[Max];
char s[Max];
int i=0,j=0,k=0,count=0;
char val;
int sum = 0;
//***********************************************获取所有的元素
c语言之康托展开
最新推荐文章于 2022-03-26 19:16:07 发布
这篇博客介绍了康托展开的概念,通过一个C语言程序展示了如何计算一个数在特定集合中的排列位置。通过示例解释了每个元素的排序过程,并提供了一个完整的代码示例来计算排列数。
摘要由CSDN通过智能技术生成