提问人:Codeer 提问时间:7/23/2022 更新时间:7/24/2022 访问量:171
如何在数字序列中找到一个特定的数字,数字的常数和等于 9 python?
How to find a specific number in a sequence of number with a constant sum of digit equal to 9 python?
问:
输入自然数 N (1 <= N <= 1,000,000)。在屏幕上打印序列的第 N 个编号:9 18 27 36 45 54 63 72 81 90 108 117 (它们的数字之和都等于 9)
N = 9+(int(input())-1)*9
def sumnum(N):
sum = 0
while N > 0:
d = N%10
N = N//10
sum += d
sumnum(N)
while sum != 9:
N+=1
sumnum(N)
print(N)
这是我的代码,它有这个错误
TimeLimitError: Stopped on Line 4
答:
您的函数不会返回任何内容,因此它永远不会在函数之外更改(或任何其他值)。通常,在尝试比较未定义的变量时会遇到错误,但实际上是内置函数的名称,所以这就是您比较 9 的原因。sumnum
sum
sum
这里有一个简单的方法:遍历循环中的所有数字,并通过将其转换为字符串并对其字符的 int 值求和来检查每个数字的总和。每次找到一个总和为 9 时,递减 1。当它达到零时,打印当前数字。while
N
>>> N = 12
>>> i = 0
>>> while True:
... i += 1
... if sum(int(d) for d in str(i)) == 9:
... N -= 1
... if N == 0:
... print(i)
... break
...
117
下面是一种更像 code-golf-y 的方法,使用过滤生成器(对于大数字效率较低,因为它构建了一个最多 N 个序列的列表,而不仅仅是打印最后一个元素):itertools.count()
>>> import itertools
>>> list(zip(range(N), (i for i in itertools.count() if sum(int(d) for d in str(i)) == 9)))[-1][-1]
117
评论
i += 9
会更快。
数字加到 9 的数字是 9 的倍数,反之亦然。所以数字加起来为 9 的第 N 个数字是 N*9。所以你所需要的只是这个:
N = int(input("Enter N: "))
print (N*9)
如果您愿意,您可以添加 N 介于 1 和 1,000,000 之间的范围检查。
评论
这对我有用!
def getSum(n):
sum = 0
for digit in str(n):
sum += int(digit)
return sum
for i in range(0, 1000000):
n = i
sum = getSum(n)
if sum == 9:
print(f"{n} -- {sum}")
这样的数字是1020011001021000。在不到一秒钟的时间内找到以下两种解决方案之一:
解决方案 1
生成最多 16 位数字的所有此类数字,然后打印第 N 个数字(在线试用!
from itertools import combinations_with_replacement
N = 1_000_000
worths = (10**i for i in range(16))
combs = combinations_with_replacement(worths, 9)
nums = sorted(map(sum, combs))
print(nums[N-1])
最多 16 位数字,数字位置值为 10^0 到 10^15。通过选择其中的 9 个位置值(允许重复)并将它们相加,您可以获得数字总和 9 的数字。
例如,1020011001021000来自一次采摘 10^15、两次采摘 10^13、一次采摘 10^10 等。
解决方案 2
想象一下,你有九个 1,你把它们移动到数字位置(“一”位置、“十”位置、“百”位置等)。它们都从“一”位置开始,所以第一个数字是 9。然后将一个移动到“十”位置,这样你就有了数字 18。再把一个移到那里,你就有 27 个了。等等。(在线试用!)
N = 1_000_000
digits = [9] + [0] * 15
for _ in range(N-1):
for i, d in enumerate(digits):
if d:
digits[i] = 0
digits[i+1] += 1
digits[0] = d - 1
break
print(int(''.join(map(str, reversed(digits)))))
上一个:字符串中有多少个数字是连续的
评论