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
相关产品推荐
相关产品推荐

