题解 | #素数伴侣#

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

import math

#判断是否为素数
def check(num):
    for i in range(2,int(math.sqrt(num))+1):
        if num % i ==0:
            return False
    return True

#配对过程
def find(odd, choose, visited, evens):
    #enumerate取得下标以及对应偶数元素,下标可以表示当前奇数与哪个下标的偶数配对
    for j,even in enumerate(evens):
        if check(odd+even) and not visited[j]: #如果当前奇数和偶数的和是素数,那么查看当前偶数是否被匹配过,没有匹配过,那么将这个偶数与当前奇数的匹配条件设置为True
            visited[j] = True
            #如果当前偶数没有与之前的奇数已经连接上,即choose对应下标依旧为0,而不是连接上的奇数,则可以直接匹配(将choose对应下标的值替换为当前奇数),如果choose对应的下标不为0,已经有对应的奇数,那么之前连接的对应奇数重新使用find寻找另外可匹配的偶数,寻找到
            #则与现在偶数断开连接,与另外可匹配的偶数连接
            if choose[j] == 0 or find(choose[j],choose,visited,evens):
                choose[j] = odd
                #返回True表示匹配成功
                return True
    return False

while True:
    try:
        n = int(input())
        #获取输入元素列表
        l = list(map(int,input().split()))
        #奇数列表
        odds = []
        #偶数列表
        evens = []
        #记录配对数量
        count = 0
        for i in l:
            if i % 2 ==0:
                evens.append(i)
            else:
                odds.append(i)
        #查询奇数与之配对的偶数
        #choose用来存放奇数与之相同下标的偶数,即为连接一对
        choose =[0]*len(evens)
        for odd in odds:
            #visited用来查看当前奇数可以和哪个偶数可以进行配对,True表示有配对的条件
            visited = [False]*len(evens)
            if find(odd,choose,visited,evens):
                count +=1
        print(count)
    except:
        break

全部评论

相关推荐

01-27 15:41
门头沟学院 Java
想躺平的菜鸡1枚:我项目比你难、学历比你好、还有SCI论文,投java都被拒一大片,现在基本上都要问点agent开发
软件开发投递记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务