幸运数字查找器

时间:2015-11-14 18:58:55

标签: python for-loop

好吧,所以我帮助我的侄女做小学有趣的数学问题。 问题是这样的: 数字是一个幸运数字,因为从第三个数字开始,每个数字是前两个数字的绝对差值。此外,幸运数字不能有重复的数字。例如,132,871,54132是幸运数字,但8918不是因为它有重复" 8"。 所以问题是问什么是最大的幸运数字.. 我在数学上非常苛刻......但我对这个问题很感兴趣,我为它编写了一个程序:     #lucky number

def is_lucky_number(n):
    n = str(n)
    islucky = False
    if len(n)>=3:
        for x in range(2,len(n)):
            if int(n[x]) != abs(int(n[x-1])-int(n[x-2])):
                return False
            else:
                islucky = True
    return islucky

def no_duplicate(n):
    n = str(n)
    for i in range(len(n)):
        sliced = n[i+1:]
        if n[i] in sliced:
            return False
    return True


for i in range(98176,9999999999):  #98176 is the largest lucky number I can think of
    if no_duplicate(i) == False:
        continue
    if is_lucky_number(i):
        print(i)

print("done")

该计划绝对是正确的,但它永远在运行......"已完成"从来没有打印过。有关以更有效的方法解决这个问题的任何想法吗?

2 个答案:

答案 0 :(得分:1)

'最大'是max

您可以从10到99开始的所有两位数字开头 - range(10, 100)

然后循环浏览列表,每次添加一个新数字,最后两位数之间的差异,并消除那些不幸运的数字。添加数字时根本没有幸运数字,我们完成了:

li=range(10,100)    
while True:
    new_li=[]
    for e in li:
        s=str(e)
        n=abs(int(s[-2])-int(s[-1]))
        if len(set(s+str(n)))==len(s)+1:
            new_li.append(int(s+str(n)))
    if new_li:
        li=new_li
    else:
        print max(li)
        break    

打印954132

如果您想要所有幸运数字,请将它们添加到列表中,然后取最大值:

# all two digit numbers that are not repeated digits
li=[e for e in range(10,100) if len(set(str(e)))==2]   
lucky=[]
while True:
    new_li=[]
    for e in li:
        s=str(e)
        ns=str(abs(int(s[-2])-int(s[-1])))
        if ns not in s:
            new_li.append(int(s+ns))
    if new_li:
        li=new_li
        lucky.extend(new_li)
    else:
        break   

print lucky     
print max(lucky)

打印:

[132, 143, 154, 165, 176, 187, 198, 231, 253, 264, 275, 286, 297, 312, 321, 341, 352, 374, 385, 396, 413, 431, 451, 462, 473, 495, 514, 523, 532, 541, 561, 572, 583, 594, 615, 624, 642, 651, 671, 682, 693, 716, 725, 734, 743, 752, 761, 781, 792, 817, 826, 835, 853, 862, 871, 891, 918, 927, 936, 945, 954, 963, 972, 981, 4132, 4312, 5143, 5231, 5321, 5413, 6154, 6514, 7165, 7253, 7341, 7431, 7523, 7615, 8176, 8264, 8352, 8532, 8624, 8716, 9187, 9275, 9451, 9541, 9725, 9817, 54132, 65143, 74312, 75231, 76154, 85321, 87165, 95413, 97253, 98176, 954132]
954132

答案 1 :(得分:0)

前两位"锁定"以下所有数字;按照链条直到找到你已经使用过的数字,那么到目前为止的所有内容都是以这些数字开头的最长链。在每对起始数字上执行此操作,并选择最高结果。

BAD = 0     # any actual lucky number will be higher than this

def make_num(digits):
    total = 0
    for d in digits:
        total = 10*total + d
    return total

def lucky_num_starting_with(a, b):
    if a == b:
        return BAD
    else:
        luckynum = [a, b]
        while True:
            c = abs(a - b)
            if c in luckynum:
                break
            else:
                luckynum.append(c)
                a, b = b, c
        return make_num(luckynum)

def main():
    largest = max(
        lucky_num_starting_with(a, b)
        for a in range(1, 10)
        for b in range(1, 10)
    )
    print("The largest lucky number is {}".format(largest))

if __name__=="__main__":
    main()

返回需要大约15毫秒

The largest lucky number is 954132

更多分析显示

[954132, 98176, 97253, 87165, 85321, 76154, 75231, 74312, 65143,
 9451, 9275, 9187, 8624, 8352, 8264, 7341, 963, 936, 891, 792,
 781, 693, 682, 671, 642, 594, 583, 572, 561, 495, 473, 462, 396,
 385, 374, 297, 286, 198]

是"原始"幸运数字(每个幸运数字都是其中一个的子串)。