Project Euler 24 25

Lexicographic permutations

原题目如下:

A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:

012   021   102   120   201   210

What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?


大概意思也就是给出 0 1 2 三个数进行排序,可以得到的按大小顺序组合是012  021  102  120  201  210

现在给出0 1 2 3 4 5 6 7 8 9 这10个数,找出按顺序排列的第100万个数。

思路如下:

其实这个不难看出,就是一个排列的问题,

分两步考虑,第一步,我们首先看共有多少种组合,把这10个数按顺序放进10个格子里面,第一个格子可以放任意一个数,有10种方法,第二个格子就只剩9个数可以选了,依次排完,我们知道,可以得到的排列组合共有10*9*8*7*6*5*4*3*2*1 即10的阶乘(以下简称10!)个排序方法,

第二步,就是找顺序了,有了第一步,不难发现,如果固定第一位为0,无论后面的数怎么排序,我们可以得到共有9!个排列组合,此时第9!个排列应该是0987654321这个数(还没到第100万个),其实我们发现100万这个数介于2*9!与3*9!之间的数,意思也就是第一位数肯定是2,因为前面2*9!个排列就代表了0和1排在第一位的所有组合!而又还没有到3*9!个,所以这个数的第一位肯定是2,依次类推,我们可以把100万这个数拆分成:

                                 1000000 = 9!*2 + 8!*6 + 7!*6 + 6!*2 + 5!*5 + 4!*1 + 3!*2 + 2!*2

那按你这么说,这个数岂不是就是26625122……完全不对好不好,不要忽悠广大群众,小心被打出去拖死,拖出去枪毙5分钟……(内心戏,哈哈)


不要以为这样就完事了,其实还没有完,不要着急~~


第三步登场~~~分析:

上面的第一个数确实是2,已经分析过了,来看第二个数,他其实不应该是6,为什么呢?细想一下,6*8!个组合应该是代表的第二位是0 1 2 3 4 5六个数排序(后面八位完全不用理会,随便你排,反正就是那么多个),但是2这个数我们已经排在第一位了呀,你还用?,所以就只能是第二位是0 1 3 4 5 6 个数的组合啦,所以按最小来算,第2位就是7了,是不是?依次类推,第三位6*7!,应该是(第三位0 1 3 4 5 6已被排列过,7刚刚被第2位用了,只能选8罗)……

So , 最后结果……


自己再推一推吧(还是秉持欧拉工程的思想吧,我们寻求的不是一个结果,而是推理验算的过程~~),你说呢?


附上代码(代码也只是算出了上面那个式子):


def factorial(n):
    sums = 1
    for x in xrange(1,n+1):
        sums = sums*x
    return sums

sums = 1000000
strs = ''
n = 9
while (sums != 0):
    z = factorial(n)
    strs = strs + str(n)+'!*' + str(sums/z) + '+'
    sums = sums%z
    n = n-1
        
print strs

得到1000000 = 9!*2 + 8!*6 + 7!*6 + 6!*2 + 5!*5 + 4!*1 + 3!*2 + 2!*2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值