检查数字的数字根是否等于素数因子列表和的数字根

2024-05-16 02:46:38 发布

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

我是基于对Python逻辑的基本理解编写这段代码的。同时我觉得代码太长了。我能得到这方面的建议吗

例子

史密斯型(22)➞ “单身史密斯”
22=2+2=4的数字根
22=2+11=13的素数因子之和
13=1+3=4的数字根
是没有兄弟的史密斯号码吗

史密斯型(7)➞ “平凡的史密斯”
给定的数字是素数

史密斯型(728)➞ “最年轻的史密斯”
728的数字根=7+2+8=17=1+7=8
728的素因子之和=2+2+2+7+13=26
26=2+6=8的数字根
729是史密斯的号码,所以728是最小的兄弟

史密斯型(6)➞ “不是史密斯”
6的数字根=6
6=2+3=5的素数因子之和
5的数字根=5

# digital root
def digRoot(num): 
    return (num - 1) % 9 + 1 if num else 0


# digital root & sum of prime factors
def digRootPrime(num):

    primeFactSum = 0
    # primeFactLst = []

    while num % 2 == 0:
        # primeFactLst.append(2)
        primeFactSum += 2
        num /= 2

    for i in range(3, int(math.sqrt(num)) + 1, 2):
        while num % i == 0:
            # primeFactLst.append(int(i))
            primeFactSum += int(i)
            num /= i
    if num > 2:
        # primeFactLst.append(int(num))
        primeFactSum += int(num)

    if len(str(primeFactSum)) < 2:
        return primeFactSum
    else:
        return digRoot(primeFactSum)

# smith type
def smithBro(num):
    
    # not a smith
    if digRoot(num) != digRootPrime(num):
        return "Not a Smith"
    
    # youngest smith
    if digRoot(num-1) == digRootPrime(num-1):
        return "Youngest Smith"

    # oldest smith
    if digRoot(num+2) == digRootPrime(num+2):
        return "Oldest Smith"

    # trivial smith
    if num > 1:
        for i in range(2, int(num/2)+1):
            if (num % i) == 0:
                break
        else:
            return "Trivial Smith"
    
    # single smith
    for i in range(num-1, num+2):
        if digRoot(i) != digRootPrime(i):
            return "Single Smith"


print( smithBro(22) ) # single smith
print( smithBro(7) ) # trivial smith
print( smithBro(728) ) # youngest smith
print( smithBro(6) ) # not a smith

Tags: returnif数字num素数因子intsmith
1条回答
网友
1楼 · 发布于 2024-05-16 02:46:38

您应该用一个数字和函数替换digRoot(以符合Smith number definition),并将其用于数字及其素数因子

primeFactors函数可以使用更高效的算法

为了处理Smith兄弟,您应该将Smith检测逻辑与文本输出分离(并让它在过程中标记平凡的Smith):

def sumDigits(num):
    return num if num<10 else num%10 + sumDigits(num//10)

def primeFactors(num): # as a generator
    p,inc = 2,1
    while p*p<num:
        while num%p == 0:
            yield p
            num //= p
        p,inc = p+inc,2
    if num > 1: yield num

# -1 means prime, 1 means Smith, 0 means not Smith
def isSmith(num):
    pf = list(primeFactors(num))
    if len(pf) == 1: return -1 # trivial Smith (prime)
    return int(sumDigits(num) == sum(map(sumDigits,pf))) # 1 or 0

def smithType(num):
    smith = isSmith(num)
    if smith:
        if smith < 0:
            return f"{num} is Trivial Smith"
        if isSmith(num+1)>0 or isSmith(num-1)>0:
            return f"{num} is a Smith Brother"
        return f"{num} is a Smith number"
    return f"{num} is not a Smith number"

输出:

print( smithType(22) )  # 22 is a Smith number
print( smithType(7) )   # 7 is Trivial Smith
print( smithType(728) ) # 728 is a Smith Brother
print( smithType(729) ) # 729 is a Smith Brother
print( smithType(6) )   # 6 is not a Smith number

请注意,如果您想区分“弟弟”和“哥哥”,您必须定义如何给同时有弟弟和哥哥(中间孩子?)的史密斯加上标签,因为史密斯数有三胞胎(例如73615、73616、73617)甚至四胞胎(例如4463535、4463536、4463537、4463538)

相关问题 更多 >