可能是一个简单的修复程序,但是当我本应达到22岁时,我始终将0用作确定值,我也必须使用动态内存分配。使用浮点数可能会出现一些问题,因为我对它们与指针的工作方式并不完全熟悉。老实说,不知道是什么导致函数输出零。
cpp.sh链接进行测试:http://cpp.sh/5bu2v
#include <iostream>
#include <math.h>
using namespace std;
float determinant(float *mat1, int &rows1)
{
float s = 1, D = 0;
float *temp = new float[rows1 * rows1];
int i, j, m, n, c;
if (rows1 == 1)
{
return (*(mat1 + 0 * rows1 + 0));
}
else
{
D = 0;
for (c = 0; c < rows1; c++)
{
m = 0;
n = 0;
for (i = 0; i < rows1; i++)
{
for (j = 0; j < rows1; j++)
{
*(temp + i * rows1 + j) = 0;
if (i != 0 && j != c)
{
*(temp + m * rows1 + n) = *(mat1 + i * rows1 + j);
if (n < (rows1 - 2))
n++;
else
{
n = 0;
m++;
}
}
}
}
int V1 = rows1 - 1;
D = D + s * (*(mat1 + 0 * rows1 + c) * determinant(temp, V1));
s = -1 * s;
}
}
return (D);
}
int main()
{
int i, j;
int n = 3;
int matrix[10][10] = {{1, 2, 3},
{0, 4, 5},
{1, 0, 6}};
float *mat1 = new float[n * n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
*(mat1 + i * n + j) = matrix[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << "Determinant of the matrix is " << determinant(mat1, n);
return 0;
}
[您对determinant
的首次调用,mat
是存储在1维数组中的3x3矩阵。像这样可视化:
A B C
D E F
G H I
您创建另一个3x3矩阵temp
。
您填充temp
矩阵的一系列循环不包括第一行和第一列c
,因此它第一次看起来像这样:
D E 0
G H 0
0 0 0
这将传递给determinant
,后者需要一个[[2x2矩阵。由于您已经传递了其他内容,因此递归调用看到的是
D E
0 G
构造temp
时,需要使用较小的矩阵尺寸,而不是源尺寸。