在下面的代码中,或者通过8输入1,我得到了正确的答案。但是对于输入>= 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的无限循环
发布于 2021-05-20 09:18:53
当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])话虽如此,整个事情可以写得更优雅,也就是。以假乱真:
N = int(input())
b = 0
while N > 0:
b += 1
if '9' in str(b):
continue
N -= 1
print(b)请注意,如果您只想要不带9的第n个数字,则不需要列表。并且使用名称list隐藏了内置的类,因此通常不受欢迎。
对于更一般的解决方案,我会编写一个不包含9的数字生成器:
def nonines():
b = 0
while True:
b += 1
if '9' not in str(b):
yield b这个生成器可以永远有效地运行,生成不包含9的数字,因为python有无限精度的整数。
您可以使用下面的内容来获取生成器的nth元素
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))https://stackoverflow.com/questions/67612714
复制相似问题