关闭

c语言之康托展开

199人阅读 评论(0) 收藏 举报
分类:
/*
	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;

	//***********************************************获取所有的元素:A C B D   或者 1324   ***************************************************************
	while(scanf("%c",&val))
	{
		if(val == '\n')
			break;
		else
		{
			s[count] = val;
			count ++;
		}
	}

	printf("count = %d\n",count);

	//**********************************分别求得元素的排序,如第一个元素需要和剩下的n-1个比较,***********************************************************
	//**********************************第二个元素需要和剩下的n-2个比较,第三个元素需要和剩下的n-3个元素进行比较等等**************************************
	for(i=0;i<count;i++)
	{
		printf("*************************%c************************\n",s[i]);
		for(j=i+1;j<count;j++)
		{
			if(s[i]>s[j])
			{
				printf("%d: %c\t%c\n",j,s[i],s[j]);
				k ++;
			}
			
		}
		printf("%d\n",k);
		num[i] = k;
		k = 0;
	}
	//*************************************输出结果:1324是第三个大数*****************************************************
	for(j=count-1;j>=0;j--)
	{
		sum += factorial_function(j) * num[k];
		printf("%d:%d = %d*%d\n",k,sum,factorial_function(j),num[k]);
		k++;
	//	printf("%c",s[k++]);
	}
	printf("是第%d大数\n",sum+1);

	return 0;
}

/*
		45231
		count = 5
		*************************4************************
		2: 4    2
		3: 4    3
		4: 4    1
		3
		*************************5************************
		2: 5    2
		3: 5    3
		4: 5    1
		3
		*************************2************************
		4: 2    1
		1
		*************************3************************
		4: 3    1
		1
		*************************1************************
		0
		0:72 = 24*3
		1:90 = 6*3
		2:92 = 2*1
		3:93 = 1*1
		4:93 = 1*0
		是第94大数	
*/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:28325次
    • 积分:561
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    最新评论