关闭

c语言之康托展开

308人阅读 评论(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
查看评论

C语言---从指针到二重指针(上)

江湖传言:得指针者得C语言。不知道这句话是从什么时候开始流传的,不过这也不重要,重要的是我们隐约能从中感受到指针在C语言中的重要性。对于初学C语言的人来说,指针可能是大多数人心中的痛。笔者当年学C语言的时候在指针这块还算顺利,自以为已经熟练掌握了指针,等到后来学习数据结构的时候,才发现自己其实一直都...
  • flysall_all
  • flysall_all
  • 2017-03-18 09:48
  • 248

(译)追本溯源 —— C之精神

声明:本文原刊于程序员杂志第10期,略有删节,非经杂志社和作者书面许可,不得转载。原文作者:Greg Colvin http://www.artima.com/cppsource/spiritofc.html 翻译:涩涩 http://blog.csdn.net/sese是否从某...
  • SeSe
  • SeSe
  • 2004-11-10 14:44
  • 3044

c语言之内存使用

要写一篇关于c内存文章 发现前辈已经写的很完善,直接转载过来 c 内存分配 1、程序代码区:存放函数体的二进制代码。   2、全局区数据区:全局数据区划分为三个区域。      全局变量和静态变量的存...
  • u010785958
  • u010785958
  • 2015-01-06 18:56
  • 251

C语言之基本算法32—鞍点

//数组 /* ================================================================== 题目:求任意矩阵的所有鞍点!并统计个数!(在矩阵中,一个数在所在行中是最大值, 在所在列中是最小值,则被称为鞍点。) 如:   ...
  • LZX19901012
  • LZX19901012
  • 2015-07-13 00:59
  • 1513

"C语言之美" -- 变量名

C语言是一种优美的语言。如果你不能体会到这种语言的魅力,那么你将无法真正爱上这门语言。 C语言是一种面向过程的语言,这也就决定它的优点和不可避免的缺点。在嵌入式领域中,是把C语言作为开发语言。这是为什么呢?我个人认为是选中C语言移植性好,能够直接访问硬件,运行效率高的3大特点。这是其它语言所不能及的...
  • zhengqijun_
  • zhengqijun_
  • 2016-08-11 15:53
  • 314

c语言坦克大战源码分析

/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h" #define a_UP  ...
  • yaowei701424
  • yaowei701424
  • 2011-08-03 00:06
  • 1469

C语言之比较法

           C语言之比较法              ...
  • qq_32046111
  • qq_32046111
  • 2016-01-26 12:22
  • 462

康托展开及其逆运算

康托展开的wiki介绍
  • wdjhzw
  • wdjhzw
  • 2014-10-03 11:49
  • 702

仿基因编程的C++源码

#ifndef __GWL_H__#define __GWL_H__//GWL名字空间的开始#define GWL_BEGIN namespace gwl{//GWL名字空间的结束#define GWL_END }//使用名字空间GWL#define _GWL using namespace gwl...
  • guanwl
  • guanwl
  • 2007-02-26 11:00
  • 4727

康托展开总结

康托展开总结 这是一个九宫格,里面只有1到9这9个数字。有一些题目涉及到八数码问题,也就是九宫格问题。在九宫格里我们自然想到用广搜去解决一些问题。可是广搜的状态怎么表示呢? 可以用string啊,长度就是9个,每个字符就是相应的数字。上图就是"342157689" 但是str...
  • Dacc123
  • Dacc123
  • 2016-03-22 08:55
  • 367
    个人资料
    • 访问:50169次
    • 积分:763
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    最新评论