如 12可以拆分成2+3+7,或5+7
实际上可以用深搜解决
def judge_prime(n):
if (n == 0 or n == 1): return False
if (n == 2): return True
if (n % 2 == 0): return False
# 判断
if 0 in [n % i for i in range(2, int(sqrt(n) + 1))]:
return False
return True
def equal_prime(n):
'''n拆分成素数之和'''
plist = [i for i in range(n + 1) if judge_prime(i)]
DFS(n, 0, 0, plist, S=set())
def DFS(n, index=0, sum_num=0, primes=[], L=[], S=set()):
if (sum_num > n):
return
if (sum_num == n):
if (tuple(L) not in S): # 避免重复输出
print(L)
S.add(tuple(L))
# 只要index没有超过素数表primes的长度,就可以继续选择,超过了则不操作,迭代返回上一层
if (index < len(primes)):
# sum==n 找到了这样的一组数字
L.append(primes[index])
DFS(n, index + 1, sum_num + primes[index], primes, L, S)
L.pop()
DFS(n, index + 1, sum_num, primes, L, S)
调用 equal_prime(30)
的运行结果是
如果选取的素数可以是重复的话,只需要改动DFS的index,表示可以重复选取数字
这里打印结果太长了,因为可以重复选取,可以自己测试下