0
#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++ で作成しています。同じことを行うためのより良いアルゴリズムがたくさんあることを私は知っています。しかし、私はこれを実装するように求められました。テストケースとして、コードで指定されたマトリックスを使用しました。このコードを実行すると、1 ではなく -4 という回答が得られます。このコードの何が問題なのかわかりません。誰か助けてくれませんか?前もって感謝します。

4

1 に答える 1

0

コードでいくつかの間違いを犯した場合は、以下のものを使用してください

#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。間違いは、k0 に初期化するのを忘れて、 を乗算するのを忘れていることですa[0][c]

于 2013-09-24T16:54:25.877 に答える