如何在数字序列中找到一个特定的数字,数字的常数和等于 9 python?

How to find a specific number in a sequence of number with a constant sum of digit equal to 9 python?

提问人:Codeer 提问时间:7/23/2022 更新时间:7/24/2022 访问量:171

问:

输入自然数 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
python 求和 数字

评论


答:

2赞 Samwise 7/23/2022 #1

您的函数不会返回任何内容,因此它永远不会在函数之外更改(或任何其他值)。通常,在尝试比较未定义的变量时会遇到错误,但实际上是内置函数的名称,所以这就是您比较 9 的原因。sumnumsumsum

这里有一个简单的方法:遍历循环中的所有数字,并通过将其转换为字符串并对其字符的 int 值求和来检查每个数字的总和。每次找到一个总和为 9 时,递减 1。当它达到零时,打印当前数字。whileN

>>> 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

评论

1赞 Kelly Bundy 7/23/2022
i += 9会更快。
0赞 Codeer 7/23/2022
它确实更快,但代码更快吗?它只能处理到1000多个
0赞 Kelly Bundy 7/24/2022
@yeet 是的,百万分之一的数字是1020011001021000,这需要很长时间。
-1赞 pdp8 7/23/2022 #2

数字加到 9 的数字是 9 的倍数,反之亦然。所以数字加起来为 9 的第 N 个数字是 N*9。所以你所需要的只是这个:

N = int(input("Enter N: "))
print (N*9)

如果您愿意,您可以添加 N 介于 1 和 1,000,000 之间的范围检查。

评论

1赞 Samwise 7/23/2022
99 = 9 * 11,但 9 + 9 != 9...
0赞 pdp8 7/23/2022
对不起,我的错。误读了这个问题。
0赞 Codeer 7/23/2022
您可以仅针对特定情况使用该公式,您必须为 EA 10、100、1000 设置 if 语句,...
0赞 Pork Lord 7/23/2022 #3

这对我有用!

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}")
1赞 Kelly Bundy 7/24/2022 #4

这样的数字是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)))))