如果它的奇数位置的数字的和等于偶数位置的数字的和,那么我们称票为幸运的。
写下一个函数,它以一个票号作为参数,并返回最近的幸运票号(如果有两个的话)。
最接近的票号意味着它与给定的票号之间的绝对差异被最小化。
一个给定的票务号码应该是一个可接受的自然2𝑘位数(它有偶数位数),没有前导零。
笔记将程序保存到文件ticket.py中,并为解决方案函数提供名称get_nearest_lucky_ticket。
Example
assert get_nearest_lucky_ticket ( 111111 ) == 111111
assert get_nearest_lucky_ticket ( 123321 ) == 123321
assert get_nearest_lucky_ticket ( 123320 ) == 123321
assert get_nearest_lucky_ticket ( 333999 ) == 334004
代码最后使用以上assert测试代码,代码写一下注释。
def get_nearest_lucky_ticket(n):
i = 0
while i<=n:
li = list(map(int,str(n+i)))
a = sum(li[0::2])
b = sum(li[1::2])
if a==b:
return n+i
li = list(map(int,str(n-i)))
a = sum(li[0::2])
b = sum(li[1::2])
if a==b:
return n-i
i += 1
assert get_nearest_lucky_ticket ( 111111 ) == 111111
assert get_nearest_lucky_ticket ( 123321 ) == 123321
assert get_nearest_lucky_ticket ( 123320 ) == 123321
assert get_nearest_lucky_ticket ( 333999 ) == 334004
就是直接判断是不是幸运数字,如果不是,加1或者减1去判断这个新数字是不是幸运数字。但是加1或者减1的时候就不用再按照原来的逻辑去重新计算奇偶累加和。如果不是特殊情况,都是最后一位数加1或者减1,所以直接偶数和加1或者减1,奇数和不变
def get_nearest_lucky_ticket(x):
str_x = list(map(int,str(x)))
lenth = len(str_x)
# 计算奇偶和
sum_odd=sum(str_x[0::2])
sum_even= sum(str_x[1::2])
if sum_odd==sum_even:
return x
x_add=x
x_de=x
add_sum_odd=sum_odd
de_sum_odd=sum_odd
add_sum_even=sum_even
de_sum_even=sum_even
# 加减1同时做查找
while True:
if list(str(x_add))[-1] == "9": #如果最后一位是9,考虑加1的情况,不然直接偶数和加1
add_sum_odd+=1
add_sum_even-=9
else:
add_sum_even+=1
if list(str(x_de))[-1] == "0":#如果最后一位是0,考虑减1的情况,不然直接偶数和减1
de_sum_odd-=1
de_sum_even+=9
else:
de_sum_even-=1
x_de=x_de-1
x_add=x_add+1
if de_sum_even==de_sum_odd:
return x_de
if add_sum_even==add_sum_odd:
return x_add
print(get_nearest_lucky_ticket ( 123320 ))
assert get_nearest_lucky_ticket ( 111111 ) == 111111
assert get_nearest_lucky_ticket ( 123321 ) == 123321
assert get_nearest_lucky_ticket ( 123320 ) == 123321
assert get_nearest_lucky_ticket ( 333999 ) == 334004