我是基于对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
您应该用一个数字和函数替换digRoot(以符合Smith number definition),并将其用于数字及其素数因子
primeFactors函数可以使用更高效的算法
为了处理Smith兄弟,您应该将Smith检测逻辑与文本输出分离(并让它在过程中标记平凡的Smith):
输出:
请注意,如果您想区分“弟弟”和“哥哥”,您必须定义如何给同时有弟弟和哥哥(中间孩子?)的史密斯加上标签,因为史密斯数有三胞胎(例如73615、73616、73617)甚至四胞胎(例如4463535、4463536、4463537、4463538)
相关问题 更多 >
编程相关推荐