首页 > 解决方案 > 计算没有数字 9 的数字时出现意外的无限循环

问题描述

在下面的代码中,或者1通过输入8,我得到了正确的答案。但是对于 input >= 9,我根本没有得到任何输出:代码无限期地运行。

这是我的代码:

N = int(input())
list = []
a = True
b = 1
        
while N > 0:
    for i in str(b):
        if i == '9':
            a = False
    if a == True:
        list.append(b)
        N -= 1
    b += 1
print(list[N - 1])

是什么导致了无限循环N >= 9

标签: pythonpython-3.x

解决方案


什么时候N是 9,你达到了b == 9. 这导致a设置为False一劳永逸。这意味着在那N -= 1之后不再发生递减,并且循环永远运行。

一个简单的解决方法是确保a在每次迭代时重置:

N = 9
list = []
b = 1
        
while N > 0:
    a = True
    for i in str(b):
        if i == '9':
            a = False
    if a == True:
        list.append(b)
        N -= 1
    b += 1
print(list[N - 1])

话虽这么说,整个事情可以写得更优雅,也就是python:

N = int(input())
b = 0
        
while N > 0:
    b += 1
    if '9' in str(b):
        continue
    N -= 1
print(b)

请注意,如果您只想要第 n 个不带 9 的数字,则不需要列表。并且使用名称list会影响内置类,因此通常不受欢迎。

对于更通用的解决方案,我会编写一个不包含九的数字生成器:

def nonines():
    b = 0
    while True:
        b += 1
        if '9' not in str(b):
            yield b

这个生成器可以永远有效地运行,生成不包含 9 的数字,因为 python 具有无限精度整数。

您可以n使用类似的东西获取生成器的第 th 个元素

for _, b in zip(range(n), nonines()):
    pass
print(b)

或者更简洁地说:

from itertools import islice

b = next(islice(nonines(), n - 1, n))

您可以使用类似的技术来获取第一个n元素的列表:

lst = [b for _, b in zip(range(n), nonines())]

或者

lst = list(islice(nonines(), n))

生成器本身可以使用以下方法显着简化itertools

from itertools import count

def nonines():
    for b in count(1):
        if '9' not in str(b):
            yield b

或者

def nonines():
    yield from (b for b in count(1) if '9' not in str(b))

推荐阅读