You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python矩阵列交换问题:交换素数列后矩阵无变化排查

代码错误分析及修复

核心错误点

  • 初始值未限定为素数:你初始化mayp和menp时直接用了matrix[0][0],但这个元素可能不是素数。后续比较时,只有当找到的素数比这个非素数大/小才会更新变量,如果所有素数都比这个非素数小,mayp会一直保留初始的非素数值,导致colmay指向错误的列(甚至是没有素数的列)。如果colmay和colmen最终指向同一列,交换后矩阵自然不变。
  • 遍历逻辑未先筛选素数:当前边遍历边更新最值的逻辑,没有先确保初始参与比较的是素数,容易出现非素数干扰判断的情况。

修复步骤

1. 先收集所有素数及其列信息

遍历矩阵时,先把所有素数和对应的列号存起来,再从这些有效数据里找最大、最小值对应的列,彻底避免非素数参与比较的问题。

2. 优化素数判断函数(可选但更高效)

原esprimo函数遍历范围过大,优化后只遍历到目标数的平方根,同时处理1、2等特殊情况,提升判断效率。

修复后的代码

def swapcol(matriz, col1, col2):
    for i in range(len(matriz)):
        # 直接用Python的解包交换,省去临时变量
        matriz[i][col1], matriz[i][col2] = matriz[i][col2], matriz[i][col1]

def esprimo(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只遍历奇数到平方根,提升效率
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

def leermatrix(matrix, r, c):
    for i in range(r):
        a = []
        for j in range(c):
            a.append(int(input("enter element: ")))
        matrix.append(a)

r = int(input("enter the number of rows: "))
c = int(input("enter the number of columns: "))
matrix = []

leermatrix(matrix, r, c)

# 收集所有素数及其所在列
prime_cols = []
for j in range(c):
    for i in range(r):
        num = matrix[i][j]
        if esprimo(num):
            prime_cols.append((num, j))

if not prime_cols:
    print("矩阵中没有素数,无需交换")
else:
    # 从素数列表中筛选最小、最大素数对应的列
    min_prime = min(prime_cols, key=lambda x: x[0])
    max_prime = max(prime_cols, key=lambda x: x[0])
    colmen = min_prime[1]
    colmay = max_prime[1]

    swapcol(matrix, colmay, colmen)
    print(matrix)

错误场景验证

比如输入矩阵:

10 6
2 5

原代码中mayp初始为10(非素数),遍历到5时,5>10不成立,mayp始终为10,colmay停在0列;而colmen会因为2<10更新为0列,最终交换同一列,矩阵无变化。修复后会收集到(2,0)和(5,1),正确交换0、1列,输出符合预期的结果。

内容的提问来源于stack exchange,提问作者VOZ ESTOICA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:12:01