PythonChallenge第10题

点击题目链接
还是图片乱点+网页源码找到的题目。
根据:a = [1, 11, 21, 1211, 111221,
求len(a[30]) = ?
先找出a中个元素是什么规律的
目测,手算都找不出来什么规律。但是,数位增加真的很快的,还有就是只有12构成的数,然后就不知道怎么搞了。
网上看到如下的规律:
规律是:
1
11— 表示前一个数“1”是 1 个 1;
21— 表示前一个数“11”是 由 2 个 1 组成;
1211— 表示前一个数“21”是 由 1 个 2、1 个 1 组成;
111221— 即 11 12 21 ,表示前一个数“1211”是依次由 1 个 1,1 个 2, 2 个 1组成;
312211—即 31 22 11,表示前一个数“111221”是依次由 3 个 1,2 个 2, 1 个 1 组成;
所以,下一个数应填 13112221—即 13 11 22 21, 表示前一个数“312211”是依次由 1 个 3,1 个 1,2 个 2,2 个 1 组成;
同理,再下一个数根据“13112221”填 1113213211,表示前一个数“13112221”是依次由 1 个 1,1 个 3,2 个 1,3 个 2,1 个 1 组成。

想了好久不知道怎么搞的
维基百科链接:http://zh.wikipedia.org/zh-cn/%E5%A4%96%E8%A7%80%E6%95%B8%E5%88%97
在上面发现一个链接:http://oeis.org/A005150,下面有个别人写的Python程序。

def A005150(n):
    p="1"
    seq=[1]
    while(n>1):
        q=''
        idx=0
        l=len(p)
        while(idx<l):
            start=idx
            idx=idx+1
            while idx<l and p[idx]==p[start]:
                idx=idx+1
            q=q+str(idx-start)+p[start]
        n,p=n-1,q
        seq.append(int(p))
    return seq

上面的就是,返回的结果是1-n的位置的所有数据,修改下程序,可以只返回第n个位置的数,或者第n个位置数字的长度。

def A005150(n):
    p="1"
    #seq=[1]
    while(n>1):
        q=''
        idx=0
        l=len(p)
        while(idx<l):
            start=idx
            idx=idx+1
            while idx<l and p[idx]==p[start]:
                idx=idx+1
            q=q+str(idx-start)+p[start]
        n,p=n-1,q
        #seq.append(int(p))
    return p

改的很简单

>>> len(A005150(30))
4462
>>> len(A005150(29))
3410
>>> len(A005150(31))
5808

还有个问题就是n=31的时候出的是30的长度,才能找到下一个的链接。知道了list 是从0下标开始的,a = [1, 11, 21, 1211, 111221, 求得是a[30]的长度,需要输入31才对。
下题链接:5808.html

你可能感兴趣的:(python,py挑战)