用Python,用奇偶性判断幸运数字

问题遇到的现象和发生背景

如果它的奇数位置的数字的和等于偶数位置的数字的和,那么我们称票为幸运的。
写下一个函数,它以一个票号作为参数,并返回最近的幸运票号(如果有两个的话)。
最接近的票号意味着它与给定的票号之间的绝对差异被最小化。
一个给定的票务号码应该是一个可接受的自然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