首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数不含数字9的数字时出现意外的无限循环

计数不含数字9的数字时出现意外的无限循环
EN

Stack Overflow用户
提问于 2021-05-20 09:11:51
回答 1查看 59关注 0票数 0

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

下面是我的代码:

代码语言:javascript
复制
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的无限循环

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-20 09:18:53

N为9时,你会得到一个点,在这个点上,b == 9。这会导致a一劳永逸地设置为False。这意味着在那之后N -= 1再也不会递减,循环将永远运行。

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

代码语言:javascript
复制
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])

话虽如此,整个事情可以写得更优雅,也就是。以假乱真:

代码语言:javascript
复制
N = int(input())
b = 0
        
while N > 0:
    b += 1
    if '9' in str(b):
        continue
    N -= 1
print(b)

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

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

代码语言:javascript
复制
def nonines():
    b = 0
    while True:
        b += 1
        if '9' not in str(b):
            yield b

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

您可以使用下面的内容来获取生成器的nth元素

代码语言:javascript
复制
for _, b in zip(range(n), nonines()):
    pass
print(b)

或者更简洁地说:

代码语言:javascript
复制
from itertools import islice

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

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

代码语言:javascript
复制
lst = [b for _, b in zip(range(n), nonines())]

代码语言:javascript
复制
lst = list(islice(nonines(), n))

使用itertools可以大大简化生成器本身

代码语言:javascript
复制
from itertools import count

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

代码语言:javascript
复制
def nonines():
    yield from (b for b in count(1) if '9' not in str(b))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67612714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档