簡體   English   中英

如何獲取 4 位數字的所有可能組合的列表,其單個數字總和為 13,最后一位數字為 5

[英]how get list of all the possible combinations of 4 digit numbers whose individual digit sum is 13 and last digit is 5 in that number

如何獲得 4 位數字的所有可能組合,其單個數字總和為 13,最后一位數字為 5?

我在 python 中嘗試如下:

nmz = []
for i in range(1000,10000):
    if ((sum(int(j) for j in str(i))==13) & (i % 10)):
        nmz = nmz.append(i)
        return(nmz)
    else:
        continue

我收到錯誤,無法獲得預期的 output:

nmz = [1165,    1345,   1435,   1615,   1705,   2245,   2425,   3055 ..... ]

錯誤是:

  1. 沒有 output 符合預期
  2. 語法錯誤:在 function 之外“返回”

將范圍從 1000 開始是沒有意義的,因為它不滿足數字應以 5 結尾的重要標准。因此,從 1005 開始並以 10 為增量。因此:

mylist = []
for i in range(1_005, 10_000, 10):
    if sum(int(d) for d in str(i)) == 13:
        mylist.append(i)

print(mylist)

Output:

[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]

使用不需要int -> str轉換的itertools.product更快的替代方案:

from itertools import product

[sum(a*10**b for a,b in zip(reversed(i), range(len(i))))  # decimal integer from individual integers
 for i in product(range(1,10), range(10), range(10), [5]) # all combinations
 if sum(i)==13]                                           # condition to keep

output:

[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]

任意位數的版本:

from itertools import product

DIGITS = 4

[sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
 for i in product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
 if sum(i)==13]

這個答案,尤其是@keyllbundy 評論中的建議比其他當前發布的答案要快得多,所有 python 用戶都應該理解這些利用itertools的技術。 如果您想查看它們的速度有多快,可以使用timeit模塊,例如:

import timeit

setup = """
import itertools

def olvin_roght():
    mylist = []
    for i in range(1_005, 10_000, 10):
        if sum(int(d) for d in str(i)) == 13:
            mylist.append(i)
    return mylist

def jonsg():
    return [10*i+5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]

def mozway():
    DIGITS = 4
    return [
        sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
        for i in itertools.product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
        if sum(i)==13
    ] 

def kelly_bundy():
    return [(1+a) * 1000 + (b-a) * 100 + (7-b) * 10 + 5
            for a, b in itertools.combinations_with_replacement(range(8), 2)]
"""
print(f"olvin_roght: {timeit.timeit('olvin_roght()', setup=setup, number=10_000)}")
print(f"jonsg: {timeit.timeit('jonsg()', setup=setup, number=10_000)}")
print(f"mozway: {timeit.timeit('mozway()', setup=setup, number=10_000)}")
print(f"kelly_bundy: {timeit.timeit('kelly_bundy()', setup=setup, number=10_000)}")

這應該會顯示如下結果:

olvin_roght: 8.36
jonsg: 7.19
mozway: 1.70
kelly_bundy: 0.08

一種稍微替代的方法是從以下方面重新構建問題:

獲取 4 位數字的所有可能組合的列表,這些數字的各個數字總和為 13,最后一位數字為 5

作為:

獲取總和為 8 的所有 3 位數字。

然后我們可以這樣做:

results = [i*10+5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]

或格式化為:

results = [
    i * 10 + 5
    for i
    in range(100, 1000)
    if 8 == sum(
            int(j)
            for j
            in str(i)
        )
]

還給我們:

[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]

您可以通過以下方式找到所有答案:

nums = []
for i in range(1000,10000):
    sumi = (sum([int(j) for j in str(i)])) # sum of i digits
    i_l = i % 10 # i last digit
    if i_l == 5 and sumi == 13:
        nums.append(i)

print (nums)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM