基于余子式法的行列式计算器代码问题:无法输出正确结果
余子式法行列式计算器代码问题
我尝试用余子式法开发行列式计算器,但无法得到正确输出,以下是我的代码:
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
代码错误点及修正方案
余子式数组填充逻辑完全错误
当前代码中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++; }
- 赋值对象错误:应该将原矩阵的
行列式展开逻辑混乱
余子式展开只需固定某一行(比如第0行)遍历列即可,不需要双重循环遍历所有行和列。原代码的双重循环会重复计算,导致结果错误。pow函数的精度隐患pow(-1, n)返回double类型,直接与整数相乘可能出现精度误差。可以用整数运算替代符号计算:((行号 + 列号) % 2 == 0) ? 1 : -1,避免浮点转换问题。硬编码2阶行列式计算
原代码直接写死了2阶行列式的计算逻辑,仅支持3x3矩阵。如果要适配任意阶数,需要递归调用行列式计算函数(1阶直接返回元素值,2阶计算交叉乘积,更高阶递归展开)。变量名冲突
函数名为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
相关产品推荐
相关产品推荐

