需要找到有效的方法来找到强大的麻木

2024-09-24 04:20:48 发布

您现在位置:Python中文网/ 问答频道 /正文

编写了一个查找强数的程序

如果一个数的阶乘和等于该数本身,则认为该数是强数。 145是1的强数!+4个!+5个!=145。在

需要接受一个列表,在列表中找到强数并返回相同的列表

我试过了:

def factorial(number):
    if number == 0 or number == 1:
        return 1
    else :
        return number * factorial(number - 1)


def find_strong_numbers(num_list):
    sum = 0
    ret_list = []
    for i in num_list :
        sum = 0
        lst = list(map(int,list(str(i))))   #Converting the number into a list of numbers
        for j in lst :
            sum += factorial(j)
        if sum == i :
            ret_list.append(i)
    return ret_list

num_list=[145,375,100,2,10]
strong_num_list=find_strong_numbers(num_list)
print(strong_num_list)

在上面的例子中,我创建了一个数字的数字列表,并找到了它的阶乘。 但是

^{pr2}$

我在数字中创建了一个数字串列表 调用阶乘函数时将字符串转换为数字。 这对我来说似乎很有效,因为我不需要将其转换为map,然后再转换为int(较少的转换)

这是正确的,这是有效的比前一个,或有任何更好的优化代码比这找到强数。在


Tags: number列表returnifdef数字findnum
3条回答

另一个版本,使用内置的math.factorialdoc):

from math import factorial

def is_strong_number(num):
    return num == sum(factorial(int(c)) for c in str(num))

num_list=[145,375,100,2,10]
strong_num_list = [num for num in num_list if is_strong_number(num)]
print(strong_num_list)

印刷品:

^{pr2}$
  1. 您可以简单地记住factorial函数来加快处理速度

    from functools import lru_cache
    
    @lru_cache(maxsize=128)
    def factorial(number):
        if number <= 1:
            return 1
        else:
            return number * factorial(number - 1)
    
  2. 同样,你可以用一个生成器来得到下一个数字

    ^{pr2}$

    这样可以避免创建断断续续的字符串列表。


注:这些都是一些小的优化,可能不会大大提高程序的性能。在

整体代码

from functools import lru_cache


@lru_cache(maxsize=128)
def factorial(number):
    if number <= 1:
        return 1
    else:
        return number * factorial(number - 1)


def get_next_digit(num):
    while num:
        yield num % 10
        num //= 10


def is_strong_number(num):
    return sum(factorial(digit) for digit in get_next_digit(num)) == num


def find_strong_numbers(num_list):
    return [num for num in num_list if is_strong_number(num)]


num_list = [145, 375, 100, 2, 10]
print(find_strong_numbers(num_list))

因为您只使用0..9的阶乘,所以不需要使用函数来计算它们,更不用说递归的了。您只需硬编码所有10个值:

facts = {'0': 1, '1': 1, '2': 2, '3': 6, '4': 24, '5': 120, '6': 720, '7': 5040, '8': 40320, '9': 362880}

然后简单地使用:

^{pr2}$

通过避免字符串转换,可以挤出更多的循环:

facts2 = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

def is_strong2(n):
    s, k = 0, n
    while k:
        s += facts2[k % 10]
        k //= 10
    return s == n

……但鉴于proven1, 2, 145, 40585旁边没有这样的数字,整个企业看起来有点毫无意义;)

相关问题 更多 >