📌  相关文章
📜  相邻单元格之和为素数的矩阵中的单元格数(1)

📅  最后修改于: 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