📅  最后修改于: 2023-12-03 14:56:28.478000             🧑  作者: Mango
给定一个 $n\times m$ 的矩阵,定义一个单元格的相邻单元格为该单元格上、下、左、右四个方向上与之相邻的单元格。例如,(i,j) 单元格的相邻单元格为 (i-1,j)、(i+1,j)、(i,j-1)、(i,j+1)。
现在需要计算该矩阵中有多少个单元格,其相邻单元格之和为素数。其中素数指大于 1 且仅有 1 和自身两个因数的自然数。
请实现一个函数 countPrimesInRange(rows: int, cols: int) -> int
,输入 $n$ 和 $m$,返回符合要求的矩阵中的单元格数。
首先需要找到所有素数,可以使用常见的 Eratosthenes 筛法,具体方法不再赘述。
接着遍历矩阵中的每个单元格,计算该单元格的相邻单元格之和,并判断该和是否为素数,若是则符合要求,结果加 1。
算法复杂度为 $O(n^2\log n)$(素数筛算法的时间复杂度),其中 $n=\max{n,m}$。
def countPrimesInRange(rows: int, cols: int) -> int:
def isPrime(num: int) -> bool:
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
count = 0
for i in range(rows):
for j in range(cols):
num = (i + 1) * (j + 1)
if isPrime(num - i - 1) and isPrime(num - j - 1) and isPrime(num + i + 1) and isPrime(num + j + 1):
count += 1
return count
assert countPrimesInRange(2, 2) == 0
assert countPrimesInRange(2, 3) == 1
assert countPrimesInRange(3, 3) == 4