HJ28 素数伴侣【python3】

文章讨论了一个关于素数伴侣的概念,即两个正整数之和为素数的组合。针对给定的一组正整数,任务是找出能形成最多素数伴侣对的最佳方案。作者提出了使用递归的方法来遍历所有可能的组合,但这种方法在处理大数据时会超时。随后进行了两次优化,首先是基于奇偶性分组减少计算量,然后是通过贪心策略删除最小配对以减少递归深度。尽管有所改进,但在某些测试用例中仍存在超时问题。

题目描述

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:
有一个正偶数 n ,表示待挑选的自然数的个数。后面给出 n 个具体的数字。
输出:
输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。

数据范围: 1≤n≤1001≤n≤1001n100 ,输入的数据大小满足2≤val≤300002≤val≤300002val30000

输入描述

1 输入一个正偶数 n
2 输入 n 个整数

输出描述

求得的“最佳方案”组成“素数伴侣”的对数。

代码

递归法 4/24

OJ提交超时,本地IDE运行答案正确。思路如下:
1、定义判断是否为素数的函数
2、定义计算素数伴侣数量的递归函数
3、两层循环遍历全排列。每次从输入数据中提出两个数据,若是素数伴侣,则数量ans+1,继续执行函数。当只剩下两个数的时候,判断是否为素数伴侣后退出递归。列表res记录所有组合的素数伴侣数量,取出最大值

N=int(input())
L=list(map(int,input().split()))

# 判断是否为素数
def is_prime(n):
    if n==2:
        return 1
    elif n==1:
        return 0
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return 0
    return 1

# 在数字列表number中找出素数伴侣的组合
res=[]
def f(number,ans):
    N=len(number)
    #print(number,N)
    if N==2:
        if is_prime(number[0]+number
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值