Cantor展开式

2024-06-14 16:18
文章标签 展开式 cantor

本文主要是介绍Cantor展开式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n)。这就是康托展开。康托展开可用代码实现。

康托展开的应用实例:

{1,2,3,4,...,n}表示1,2,3,...,n的排列 如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。
  代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。
  他们间的对应关系可由康托展开来找到。
  如我想知道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!+1*0!就是康托展开。
  再举个例子:1324是{1,2,3,4}排列数中第几个大的数:第一位是1小于1的数没有,是0个 0*3! 第二位是3小于3的数有1和2,但1已经在第一位了,所以只有一个数2 1*2! 。第三位是2小于2的数是1,但1在第一位,所以有0个数 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2个,1324是第三个大数。

 

#include <iostream>
#include <string>
using namespace std;const int SIZE    = 12;
const string END  = "-1";
int factory[SIZE] = { 0, 1, 2, 6, 24, 120,720, 5040, 40320, 362880, 3628800,39916800 }; int main(){int pos = 0;string val;while( true ){pos = 0;cin >> val;if( val == END ) break;const int size = val.length();for( int i = 0; i < val.length(); ++i ){int count = 0;for( int j = i + 1; j < val.length(); ++j ){if( val[i] > val[j] )count++;}pos += count * factory[size - i - 1];}cout << val << " is in the position of : " << pos + 1 << endl;}return 0;}


这篇关于Cantor展开式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060895

相关文章

别人的傅氏级数展开式函数

在 Matlab 中,没有专门求傅氏级数的函数调用,但我们可编写一个函数来求 f (x)在 [-l,l]上的 Fourier 级数. 打开 Matlab 的 M 文件编辑窗口,输入如下命令行:  function [A,B,F]=fseries(f,x,n,a,b)  if nargin==3,a=-pi;b=pi;end  L=(b-a)/2;  if a+b~=0,f=subs(f,x,x+L

WikiOI 1083 Cantor表

不算难。 #include<stdio.h>int main(){int i,n,bn;scanf("%d",&bn);n=bn;for(i=1;n>0;i++)n-=i;n+=i;if(i%2==1)printf("%d/%d",n-1,i+1-n);else printf("%d/%d",i+1-n,n-1);return 0;}

1083 Cantor表(模拟)

思路: 找规律吧 主要是找出第N个元素在哪一行 按照z形走的话第i行有i个元素 奇数行,第j个元素是(i-j+1,j) 偶数行,第j个元素是(j,i-j+1) #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int main()

(泰勒展开式/欧拉公式)证明:e^x推导及e^(iπ) = -1展开过程

欧拉公式意义:欧拉公式是在复分析领域的公式,将三角函数与复数指数函数相关联,因其提出者莱昂哈德·欧拉而得名.1.将指数函数ex展开成幂级数形式。首先,假设有恒等式:e^x= a0 + a1x + a2x^2 + a3x^3 + a4x^4 + …+ anx^n(n趋向无穷大)两侧取导数:e^x = 0 + a1 + 2a2x + 3a3x^2 + 4a4x^3 + …+ nanx^(n-1

泰勒级数定义及相关展开式

泰勒级数、欧拉公式、三角函数 泰勒级数的定义: 若函数f(x)在点的某一临域内具有直到(n+1)阶导数,则在该邻域内f(x)的n阶泰勒公式为: 其中:,称为拉格朗日余项。 以上函数展开式称为泰勒级数。 泰勒级数在幂级数展开中的作用: 在泰勒公式中,取,得: 这个级数称为麦克劳林级数。函数f(x)的麦克劳林级数是x的幂级数,那么这种展开是唯一的,且必然与f(x)的麦克劳

【[NOIP1999 普及组] Cantor 表】

题目描述 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 我们以 Z 字形给上表的每一项编号。第一项是 1 / 1 1/1 1/1,然后是 1 / 2 1/2 1/2, 2 / 1 2/1 2/1, 3 / 1 3/1 3/1, 2 / 2 2/2 2/2,… 输入格式 整数 N N N( 1 ≤ N ≤ 1 0 7

算法之康托展开式

康托展开式: X=an(n-1)!+(an-1)(n-2)!+…+ai(i-1)!+…+a2*1!+a1*0! (解决一些序列问题的算法)*    其中,ai为当前未出现的元素中是排在第几个(从0开始)。这个公式可能看着让人头大,最好举个例子来说明一下。例如,有一个数组 s = ["A", "B", "C", "D"],它的一个排列 s1 = ["D", "B", "A", "C"],现在

洛谷_P1014 [NOIP1999 普及组] Cantor 表_python写法

这道题其实没什么特别的,最重要就是仔细分析找到其中的数学规律。 以斜着为行,每一行的数值就是与第几行有关。 那对于Z字形而言就是行数的奇偶判断。 n = int(input())ans = 0flag = 0l = ['0']while ans < n:flag += 1ans += flagans -= flagn -= ansj = flagif flag%2 =

RQNOJ292 Cantor表 题解、、

题目:Cantor表 问题编号:292 题目描述 现代数学的著名证明之一是GeorgCantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:1/1 1/2 1/3 1/4 1/5 …2/1 2/2 2/3 2/4 …3/1 3/2 3/3 …4/1 4/2 …5/1 ……我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…要求编写程序,

浅显易懂——泰勒展开式

第一次见到泰勒展开式的时候,我是崩溃的。泰勒公式长这样: 好奇泰勒是怎么想出来的,我想,得尽量还原公式发明的过程才能很好的理解它。 首先得问一个问题:泰勒当年为什么要发明这条公式? 因为当时数学界对简单函数的研究和应用已经趋于成熟,而复杂函数,比如:这种一看就头疼的函数,还有那种根本就找不到表达式的曲线。除了代入一个x可以得到它的y,就啥事都很难干了。所以泰勒同学就迎难而上!决定让这些式