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

如 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,表示可以重复选取数字
在这里插入图片描述

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值