当前位置:   article > 正文

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

素数伴侣 python

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

知识点:

  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的用户)

  1. # 质数又称素数,是指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。
  2. # 例如,2、3、5、7、11等都是质数。
  3. def isPrime(num):
  4. # 素数是一个大于1的自然数
  5. if num < 2:
  6. return False
  7. # 能不能被其它数整除
  8. # a ** b 表示a的b次方。
  9. for i in range(2, int(num ** 0.5) + 1):
  10. if num % i == 0:
  11. return False
  12. return True
  13. def find_prime_pairs(nums):
  14. # 把数组中的奇数和偶数分开保存
  15. even, odd = [], []
  16. for i in nums:
  17. if i % 2 == 0:
  18. even.append(i)
  19. else:
  20. odd.append(i)
  21. # 找出所有可能的素数组合
  22. # 都是偶数或者都是奇数
  23. if not (even and odd):
  24. return 0
  25. else:
  26. # 建立二维数组的交叉表格,判断各个组合是否能构成素数
  27. matrix = []
  28. # 行是偶数
  29. for r in range(len(even)): # Iterating over the rows of the output matrix
  30. row = [] # Creating an empty list to store the row elements
  31. # 列是奇数
  32. for c in range(len(odd)): # Iterating over the columns of the output matrix
  33. if isPrime(even[r] + odd[c]): # Checking if the sum of the elements from even and odd meets the prime condition
  34. row.append(1) # If the sum is prime, adding 1 to the row list
  35. else:
  36. row.append(0) # If the sum is not prime, adding 0 to the row list
  37. matrix.append(row) # Adding the constructed row to the output matrix
  38. # print(matrix)
  39. # 素数伴侣的组数
  40. cnt = 0
  41. # 贪心算法(删除最小匹配的行)
  42. # map(sum, matrix)的意思是,对matrix中的每一行(即每一个子列表)应用sum`函数,计算每一行的和
  43. # 如果二维矩阵中还有1
  44. while sum(map(sum, matrix)):
  45. # k = [float("inf"), 0] 可以被解释为:一个列表,其中第一个元素是正无穷大,第二个元素是0
  46. # k中的第一个元素表示一行中的总和,代表可以该偶数可以和所有奇数产生多少个素数伴侣,第二个元素表示行号
  47. k = [float("inf"), 0]
  48. # 求和最小的行
  49. for r in range(len(matrix)):
  50. if 0 < sum(matrix[r]) < k[0]:
  51. k = [sum(matrix[r]), r]
  52. # 每次把成功配对次数最少的那个偶数和第一个与之配对的奇数从数组里删除
  53. r, c = k[1], matrix[k[1]].index(1)
  54. even.pop(r)
  55. odd.pop(c)
  56. matrix.pop(r)
  57. for i in matrix:
  58. # 每行中删除第c个元素
  59. i.pop(c)
  60. cnt += 1
  61. return cnt
  62. n = int(input())
  63. numbers = list(map(int, input().split()))
  64. # print(numbers)
  65. print(find_prime_pairs(numbers))

by 软件工程小施同学

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/901622
推荐阅读
相关标签
  

闽ICP备14008679号