24小时热门版块排行榜    

查看: 1841  |  回复: 19
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第廿四题:全排列的第100万项 已有5人参与

一个排列是一组对象的一个有序排列。比如3123是数字1、2、3和4的一个可能的排列。如果把所有的排列按照其数字or字母的大小顺序都列出来,那就成为一个全排列。比如0、1、2的全排列是:
012 021 102 120 201 210

那么,数字0、1、2、3、4、5、6、7、8和9的全排列的第100万项是多少?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★
微尘、梦想(金币+3): 鼓励交流~~ 2011-06-10 21:53:27
晕,发晚了


楼上怎么没人帖答案和时间了?

我的想法是利用阶乘直接算。因为一个全排列,其实就是每个元素都要在一个位置上出现一次。这样一共有n!个排列(这个地球人都知道)。
这样,如果某一位确定了的话,那么其余的位再用其余的数全排列就行了。(这话怎么这么绕口)

已经知道10!=3628800,9!=362880,这样1000000 - 2*9! = 274240, 也就是说第一位取0,1都不够数,取2,而后面的没的完成全排列就够100万了。OK,第一位是2了。
下面列表:

8! = 40320  274240 - 6 * 8! = 32320 第2位:7
7! = 5040   32320  - 6 * 7! = 2080  第3位:8
6! = 720    2080   - 2 * 6! = 640   第4位:3
5! = 120    640    - 5 * 5! = 40    第5位:9
4! = 24     40     - 1 * 4! = 16    第6位:1
3! = 6      16     - 2 * 3! = 4     第7位:5
2! = 2      4      - 2 * 2! = 0

最后剩:0 4 6 这三个数了. 而最后一个余0了。也就是第2个排列正好就够第100万个了.这样结果就是:2783915460

不知道结果是不是对。这个用时当然很少的了。
8楼2011-06-10 17:09:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★
微尘、梦想(金币+3): 鼓励交流~~ 2011-06-10 21:53:45
python版代码,算法刚才解释过了。
CODE:
def fac(n):
    return reduce(lambda x, y: x*y, range(1, n+1))

n = 1000000
i = 9
numbers = range(10)
result = []

while i > 0 and n > 0:
    if n % fac(i) != 0:
        result.append(numbers[n/fac(i)])
    else:
        result.append(numbers[n/fac(i)-1])
    numbers.remove(result[-1])
    n  = n % fac(i)
    i -= 1

if len(numbers) > 0:
    numbers.reverse()
    result.extend(numbers)

print "".join([str(x) for x in result])

[ Last edited by holmescn on 2011-6-11 at 07:58 ]
10楼2011-06-10 18:03:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


jjdg(金币+1): 感谢参与 2011-06-11 00:31:23
引用回帖:
Originally posted by fatpig8832 at 2011-06-10 17:32:00:
这个...不就是题目中的一百万吗...不过这不是编程而是死算,初中生甚至小学生都能搞出来...

8楼的做法应该和我的一样吧,虽然我没怎么看懂...

和你的算法是一样的。嘿嘿。
11楼2011-06-10 18:04:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

引用回帖:
Originally posted by qinghuoly at 2011-06-27 00:08:17:
优雅如魔鬼的J语言登场:

参考http://www.jsoftware.com/jwiki/Essays/Permutations
CODE:
perm=: i.@! A. i.
n=:1e6-1
n{::perm 10

单行程序:
[code](1e6-1){:i.@!A.i. ...

这东西可读性很差啊,又不数学,又不自然语言,不觉得有什么美的。和Brain Fuck那个语言差不多。
13楼2011-06-27 09:30:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

引用回帖:
Originally posted by qinghuoly at 2011-06-27 23:39:12:
我解释一下程序:

perm=: i. @ ! A. i.
定义算子perm
按照语法展开perm n(n为任意正整数)为:
  (i. ! n) A. (i. n)
其中i. n 产生一个列表,0, 1, 2, ... n-1,共n项。
i. ! n 产生列表,0, 1, 2,  ...

这个A.操作还是不理解,能不能给个例子啊?
19楼2011-06-28 16:28:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见