вторник, 27 апреля 2010 г.

определитель матрицы

и снова определитель матрицы


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int n = 4;

void print(int**, int);
void clear(int**, int**, int, int, int);
long Determinant(int**, int);

void main()
{
 time_t t;
 srand(time(&t));

 int** a = new int*[n];
 for (int i = 0; i < n; i++) a[i] = new int[n];


 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j ++)
  {
   a[i][j] = rand() % 10;
  }
 }

 print(a, n);

 long dt = Determinant(a, n);
 printf("\nDeterminant = %d\n", dt);

 for (int i = 0; i < n; i++) delete[] a[i];
 delete[] a;
}

void print(int** a, int n)
{
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
  {
   printf("%d\t", a[i][j]);
  }

  printf("\n");
 }
}

void clear(int** a, int** b, int m, int i, int j)
{
 int di = 0;
 int dj;

 for (int ki = 0; ki < m - 1; ki++)
 {
  if (ki == i)
   di = 1;

  dj = 0;
  for (int kj = 0; kj < m - 1; kj++)
  {
   if (kj == j)
    dj = 1;

   b[ki][kj] = a[ki + di][kj + dj];
  }
 }
}

long Determinant(int** a, int n)
{
 if (n == 1)
  return a[0][0];

 if (n == 2)
  return a[0][0] * a[1][1] - a[0][1] * a[1][0];

 int** b = new int*[n];
 for (int i = 0; i < n; i++) b[i] = new int[n];

 int d = 0;
 int k = 1;
   
 for (int i = 0; i < n; i++)
 {
  clear(a, b, n, i, 0);
  d += k * a[i][0] * Determinant(b, n - 1);
  k--;
 }

 for (int i = 0; i < n; i++) delete[] b[i];
 delete[] b;

 return d;
}

Комментариев нет:

Отправить комментарий