python - 计算没有数字 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
?
解决方案
什么时候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))
推荐阅读
- oracle - SQL 加载程序 - 在 TERMINATED 和 ENCLOSED 字段后找不到终止符 - 脏数据
- javascript - 使用扩展运算符更新不同级别的状态
- mysql - 基于辅助表的 GROUP_CONCAT 排序
- powershell - PowerShell - 如何运行取决于服务启动的命令?
- python - Powm api中的异常问题
- amazon-web-services - 为什么当 root 用户可以重新放回 S3 存储桶时,AWS 会提供撤销 root 用户访问权限的选项?
- python - 在 python 中为 init 使用其他名称
- javascript - 每个备用页面重新加载我都会收到 412 Precondition Failed ,它只发生在 chrome 浏览器中
- python - 用python列出文件名的问题
- r - dplyr 中的“summarise_all”和计算/输出顺序的描述性统计