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

基于余子式法的行列式计算器代码问题:无法输出正确结果

余子式法行列式计算器代码问题

我尝试用余子式法开发行列式计算器,但无法得到正确输出,以下是我的代码:

void det(int r,int c) {
    int check = 0;
    if(r==c) {
        check = 1;  
    } else check = 0;
    
    if(check) {
        int matrix[r][c], co[r-1][c-1];
        int i,j,k,t;
        int result = 0;
        int det = 0;
        
        printf("Enter your SQUARE matrix:\n");
        for(i=0;i<r;i++) {
            for(j=0;j<c;j++) {
                scanf("%d", &matrix[i][j]);
            }
        }
        
        for(i=0;i<r;i++) {
            int p=i;
            for(j=0;j<c;j++) {
                int q=j;
                for(k=0;k<r;k++){
                    for(t=0;t<c;t++) {
                        if(k!=p && t!=q) {
                            co[k-1][t-1] = matrix[i][j];
                        }
                    }
                }
                int det = (co[0][0] * co[1][1]) - (co[0][1] * co[1][0]);
                result += (matrix[0][j] * pow(-1,(i+1)+(j+1))) * det;   
            }
        }
        
        printf("%d", result);
    }
                
}
  • co数组:用于存储余子式的数组
  • 这并非主函数,需要更多信息可告知

测试用例:
3x3矩阵:

1 2 4
-1 2 2
5 1 3

预期输出:

-14

代码错误点及修正方案

  1. 余子式数组填充逻辑完全错误
    当前代码中co[k-1][t-1] = matrix[i][j];存在两个致命问题:

    • 赋值对象错误:应该将原矩阵的matrix[k][t]存入余子式数组,而非固定的matrix[i][j]
    • 索引越界:当k < p时,k-1会变成负数,直接导致数组访问越界。正确的填充方式应该用独立计数器记录余子式数组的行列位置:
      int co_row = 0, co_col = 0;
      for(k=0;k<r;k++){
          co_col = 0;
          if(k == p) continue; // 跳过当前行
          for(t=0;t<c;t++) {
              if(t == q) continue; // 跳过当前列
              co[co_row][co_col] = matrix[k][t];
              co_col++;
          }
          co_row++;
      }
      
  2. 行列式展开逻辑混乱
    余子式展开只需固定某一行(比如第0行)遍历列即可,不需要双重循环遍历所有行和列。原代码的双重循环会重复计算,导致结果错误。

  3. pow函数的精度隐患
    pow(-1, n)返回double类型,直接与整数相乘可能出现精度误差。可以用整数运算替代符号计算:((行号 + 列号) % 2 == 0) ? 1 : -1,避免浮点转换问题。

  4. 硬编码2阶行列式计算
    原代码直接写死了2阶行列式的计算逻辑,仅支持3x3矩阵。如果要适配任意阶数,需要递归调用行列式计算函数(1阶直接返回元素值,2阶计算交叉乘积,更高阶递归展开)。

  5. 变量名冲突
    函数名为det,内部又定义了同名变量int det = 0;,虽然C语言允许,但极易混淆,建议将内部变量改名(比如sub_det)。


修正后的3x3适配代码示例

#include <stdio.h>

// 计算2阶行列式
int det2(int mat[2][2]) {
    return mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
}

void det(int r, int c) {
    if (r != c) {
        printf("Not a square matrix!\n");
        return;
    }

    int matrix[r][c];
    int i, j, k, t;
    int result = 0;

    printf("Enter your SQUARE matrix:\n");
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    // 按第0行展开计算3阶行列式
    for (j = 0; j < c; j++) {
        int co[2][2];
        int co_row = 0, co_col;
        // 填充余子式数组
        for (k = 0; k < r; k++) {
            if (k == 0) continue; // 跳过第0行
            co_col = 0;
            for (t = 0; t < c; t++) {
                if (t == j) continue; // 跳过第j列
                co[co_row][co_col] = matrix[k][t];
                co_col++;
            }
            co_row++;
        }
        // 计算符号:(-1)^(行号+列号),此处行号为0(0-based)
        int sign = ((0 + j) % 2 == 0) ? 1 : -1;
        int sub_det = det2(co);
        result += matrix[0][j] * sign * sub_det;
    }

    printf("%d\n", result);
}

// 主函数示例
int main() {
    det(3, 3);
    return 0;
}

运行该代码输入测试矩阵,即可得到预期的-14。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:10:14