#include<iostream.h>
#include<conio.h>
#include<math.h>
double Det (double a[2][2], int size);
void form(double a[2][2], int c, int size);
double b[2][2];
double Det(double a[2][2], int size) {
if (size==1) {
return a[0][0];
}
else {
double ans = 0.0;
int c;
for (c=0;c<size;c++) {
form(a,c,size);
ans += pow(-1.0,(double)c)*Det(b,size-1);
}
return ans;
}
}
void form(double a[2][2], int c, int size) {
int i,j=0,k,l=0;
for (i=0;i<size;i++) {
for (j=0;j<size;j++) {
if ((i!=0)&&(j!=c)) {
if (l==size-1) {
k++;
l=0;
}
b[k][l]=a[i][j];
l++;
}
}
}
}
int main() {
double mat[2][2] = {{1.0,2.0},{3.0,7.0}};
cout << Det(mat,2);
getch();
return 0 ;
}
Я пишу программу на C ++ для вычисления определителя матрицы с использованием рекурсии. Я знаю, что есть много лучших алгоритмов, чтобы сделать то же самое. Тем не менее, меня попросили реализовать это. В качестве тестового примера я использовал матрицу, указанную в коде. Когда я запускаю этот код, я получаю ответ -4 вместо 1. Я не понимаю, что не так с этим кодом. Может ли кто-нибудь помочь, пожалуйста? Заранее спасибо.
Вы сделали несколько ошибок в своем коде, используйте приведенную ниже
#include<iostream>
#include<math.h>
using namespace std;
double Det (double a[2][2], int size);
void form(double a[2][2], int c, int size);
double b[2][2];
double Det(double a[2][2], int size)
{
if(size==1)
return a[0][0];
else
{
double ans=0.0;
int c;
for(c=0;c<size;c++)
{
form(a,c,size);
ans+=pow(-1.0,(double)c) * a[0][c] * Det(b,size-1);
}
return ans;
}
}
void form(double a[2][2], int c, int size)
{
int i,j=0,k = 0,l=0;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
if((i!=0)&&(j!=c))
{
if(l==size-1)
{
k++;
l=0;
}
b[k][l]=a[i][j];
l++;
}
}
}
}
int main()
{
double mat[2][2]={{1.0,2.0},{3.0,7.0}};
cout<<Det(mat,2);
return 0 ;
}
Это дает вам 1
, Ошибки, которые вы забыли инициализировать k
до 0, и вы забудете умножить a[0][c]
,
Других решений пока нет …