输出第k个排列

1到n 的n个数,有n!种排列(n最大为9),将这些排列从小到大的顺序进行排列 ,输出第k个排列。

例如:

输入3,2

3!共有6种排列,从小到大的排列为:

123

132

213

231

312

321

输出 132

思路:

1到n,记为list_n,排列的首位为1的话,那么有(n-1)!种排列,通过a=k/(n-1)!可以得到首位的数字list_n[a],将list_n[a]从list_n中移除,再将余数b=k%(n-1)!进行下一次阶乘(n-2)!相除,直到能整除;注意如果能整除的话首位的数字应该是list[a-1],然后把剩余的数倒叙即可

import math


# 定位k

def findNumByOrder(n, k):
    list_result = []
    list_n = [i for i in range(1, n + 1)]
    for i in range(n - 1, 0, -1):
        # print('阶乘:{0}'.format(i))
        factorial_num = math.factorial(i)
        a = int(k / factorial_num)
        b = k % factorial_num
        # print(list_n)
        if b == 0:
            temp = list_n[a - 1]
            list_result.append(temp)
            list_n.remove(temp)
            list_n.reverse()
            list_result = list_result + list_n
            print(''.join([str(x) for x in list_result]))
            return
        temp = list_n[a]
        list_result.append(temp)
        list_n.remove(temp)
        k = b


findNumByOrder(9, 362880)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值