将一个数拆分成多个素数之和

如 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)的运行结果是
将一个数拆分成多个素数之和_第1张图片
如果选取的素数可以是重复的话,只需要改动DFS的index,表示可以重复选取数字
将一个数拆分成多个素数之和_第2张图片

这里打印结果太长了,因为可以重复选取,可以自己测试下

你可能感兴趣的:(Python)