-2
    #include<iostream>
    using namespace std;
    int determ=0;//declare the variable to hold determinant value

\ \ \

  int *insert(int *a,int start,int n)  /* function to insert cofactor of a particular element into array and return the address of that array named add*/
    {
int p=(n-1)*(n-1);// n is number of rows in n*n matrix =n
int *add=new int[p];// declaring an array for cofactor of start
int z=0,i=start+n+1;// i is now pointing to first elementt of its co factor
while(z<p)
{
    if((i-n)%n!=0)   // to exclude all elements in same row and column as start
    {
        *(add+z)=*(a+i);//assigning cofactor eles to array add
        z++;
        
    }
    i++;// incrementing i 
}
 return add;// returning the address of function which holds cofactor eles
     } 

\ \ \

   int fun(int *a,int n)// takes array address and number of cls in 2d matrix
 {   
int k=1;// k is either 1 or -1
if(2<n) // for l determinant more than 22 rows and 2 columns
{

for(int i=0;i<n;i++)   // for all elements in first row

{
    if(i%2!=0)// when i is odd
    {
        k=-1;  // k=-1 for odd indices
    }
    int *init_add=insert(a,i,n);// i is the order of element wose cofactor is to be found
    determ=determ+(k*(*(a+i))*fun(init_add,n-1));// calling function to find determinant of its cofacot matrix
}
return determ;// returning determinant value
    }
     else if(n==2) // determinant of order 2*2
  {
    int p=*(a)*(*(a+3))-(*(a+1)*(*(a+2))); // directly find determinant if the matrix is 2*2
   return p;// return value of 2*2 determinant
 }

\ \ \

     int main()// 
      {
       int a[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};  // row major representation of 2 d matrix
      cout<<fun(a,4);// calling function fun and passing array and n=3
       //FUNCTION CALL
      }

OUTPUT:

GARBAGE VALUE// LIKE 2345364637

MikeCAT
  • 73,922
  • 11
  • 45
  • 70
ARYA
  • 1
  • 1
  • 1
    Please format your code consistently! Non only does it scare away people here, it also makes it easy to miss mistakes for you. In general, you should supply a [mcve]. As a new user here, also take the [tour] and read [ask]. – Ulrich Eckhardt May 15 '21 at 11:18
  • I will make sure it doesn't happen the next time – ARYA May 15 '21 at 11:27
  • @ARYA You can always [edit](https://stackoverflow.com/posts/67546126/edit) your question. – Ted Klein Bergman May 15 '21 at 13:13

2 Answers2

0

I debugged your code and found that, here:

int p=*(a)*(*(a+3))-(*(a+1)*(*(a+2))); // directly find determinant if the matrix is 2*2

You receive pointer not for 2x2 array, but only one single value. And by trying to point on the next element (a+3 or a+1 or a+2) you are pointing to not initialized variables.

You have to debug and find out where you are loosing array for only first element.

0

There are three errors.

  1. int z=0,i=start+n+1;// i is now pointing to first elementt of its co factor
    while(z<p)
    {
        if((i-n)%n!=0)   // to exclude all elements in same row and column as start
    

    By initializing i to start+n+1, the submatrix elements to the left of column start are missed. To correct this, we can initialize i to n and adjust the exclusion test accordingly:

        int z=0, i=n;   // i is now pointing to first row of the (0, start) minor
        while (z<p)
        {
            if (i%n != start)   // to exclude all elements in same column start
    
  2. Since determ is used in recursive invocations of fun, the global definition is unsuitable; rather define int determ=0; right before the for loop where it's needed.

  3. Also in fun, the sign k is not again set to 1 after it has once been set to -1 on an odd column. Better set k always to the correct value before use:

            k = i%2 ? -1 : 1;   // k=-1 for odd, 1 for even indices
    
Armali
  • 18,255
  • 14
  • 57
  • 171