好吧,所以我帮助我的侄女做小学有趣的数学问题。 问题是这样的: 数字是一个幸运数字,因为从第三个数字开始,每个数字是前两个数字的绝对差值。此外,幸运数字不能有重复的数字。例如,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")
该计划绝对是正确的,但它永远在运行......"已完成"从来没有打印过。有关以更有效的方法解决这个问题的任何想法吗?
答案 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]
是"原始"幸运数字(每个幸运数字都是其中一个的子串)。