华为机考入门python3--(28)牛客28-素数伴侣

分类:质数、素数、贪心算法、矩阵

知识点:

  1. 素数里除了2,都是奇数

  2. 奇+奇=偶,偶+偶=偶

  3. 对矩阵求和 sum(map(sum, matrix))

  4. 查找元素 3 在列表中的索引 my_list.index(3)

题目来自【牛客】

质数又称素数,是指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。例如,2、3、5、7、11等都是质数。

  1. 素数里除了2,都是奇数。奇+奇=偶,偶+偶=偶,大于2的偶数都不是素数。所以素数伴侣一定是由一个偶数一个奇数组成。

  2. 把数组中的奇数和偶数分开保存,建立二维数组的交叉表格,判断各个组合是否能构成素数

  3. 遍历二维数组的每行,也就是偶数,利用贪心算法,每次把成功配对次数最少的那个偶数和第一个与之配对的奇数从数组里删除,直到二维数组里不存在配对的奇偶数对。

(来自牛客id:399316398的用户)

python 复制代码
# 质数又称素数,是指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。
# 例如,2、3、5、7、11等都是质数。
def isPrime(num):
    # 素数是一个大于1的自然数
    if num < 2:
        return False
    # 能不能被其它数整除
    # a ** b 表示a的b次方。
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True


def find_prime_pairs(nums):
    # 把数组中的奇数和偶数分开保存
    even, odd = [], []
    for i in nums:
        if i % 2 == 0:
            even.append(i)
        else:
            odd.append(i)
    
    # 找出所有可能的素数组合
    # 都是偶数或者都是奇数
    if not (even and odd):
       return 0
    else:
        # 建立二维数组的交叉表格,判断各个组合是否能构成素数
        matrix = []
        # 行是偶数
        for r in range(len(even)):  # Iterating over the rows of the output matrix
            row = []  # Creating an empty list to store the row elements
            # 列是奇数
            for c in range(len(odd)):  # Iterating over the columns of the output matrix
                if isPrime(even[r] + odd[c]):  # Checking if the sum of the elements from even and odd meets the prime condition
                    row.append(1)  # If the sum is prime, adding 1 to the row list
                else:
                    row.append(0)  # If the sum is not prime, adding 0 to the row list
            matrix.append(row)  # Adding the constructed row to the output matrix

        # print(matrix)

        # 素数伴侣的组数
        cnt = 0
        # 贪心算法(删除最小匹配的行)
        # map(sum, matrix)的意思是,对matrix中的每一行(即每一个子列表)应用sum`函数,计算每一行的和
        # 如果二维矩阵中还有1
        while sum(map(sum, matrix)):
            # k = [float("inf"), 0] 可以被解释为:一个列表,其中第一个元素是正无穷大,第二个元素是0
            # k中的第一个元素表示一行中的总和,代表可以该偶数可以和所有奇数产生多少个素数伴侣,第二个元素表示行号
            k = [float("inf"), 0]
            # 求和最小的行
            for r in range(len(matrix)):
                if 0 < sum(matrix[r]) < k[0]:
                    k = [sum(matrix[r]), r]
            # 每次把成功配对次数最少的那个偶数和第一个与之配对的奇数从数组里删除
            r, c = k[1], matrix[k[1]].index(1)
            even.pop(r)
            odd.pop(c)
            matrix.pop(r)
            for i in matrix:
                # 每行中删除第c个元素
                i.pop(c)
            cnt += 1

        return cnt

n = int(input())
numbers = list(map(int, input().split()))
# print(numbers)
print(find_prime_pairs(numbers))

by 软件工程小施同学

相关推荐
郑洁文1 小时前
面向Web安全的Python渗透测试系统设计与实现
python·安全·web安全
情绪总是阴雨天~1 小时前
智能语音分析Agent项目
python·自动化·fastapi·langgraph
Dxy12393102162 小时前
Django 数据库 ENGINE 完全指南:选错了,性能差 10 倍
python·django
码不停蹄的玄黓2 小时前
Java 生产者-消费者模型详解
java·开发语言·python
凯瑟琳.奥古斯特3 小时前
力扣1235:加权区间调度最优解
java·python·算法·leetcode·职场和发展
郑洁文4 小时前
基于Python的网络入侵检测系统
网络·python·php
AIMath~4 小时前
python中的uv命令揭秘
开发语言·python·uv
弹简特4 小时前
【零基础学Python】06-Python模块和包、异常处理、文件常用操作
开发语言·python
念恒123064 小时前
Python 面向对象编程核心:对象、实例化、封装与变量作用域
开发语言·python