#include<iostream>
#include<iomanip>
using namespace std;
const int MAX = 10 ;
// Function to calculate determinant of a matrix
double determinant( double mat[ MAX] [ MAX] , int n) {
double det = 0 ;
if ( n == 1 )
return mat[ 0 ] [ 0 ] ;
if ( n == 2 )
return ( mat[ 0 ] [ 0 ] * mat[ 1 ] [ 1 ] - mat[ 0 ] [ 1 ] * mat[ 1 ] [ 0 ] ) ;
double temp[ MAX] [ MAX] ;
int sign = 1 ;
for ( int f= 0 ; f< n; f++ ) {
int subi = 0 ;
for ( int i= 1 ; i< n; i++ ) {
int subj = 0 ;
for ( int j= 0 ; j< n; j++ ) {
if ( j == f)
continue ;
temp[ subi] [ subj] = mat[ i] [ j] ;
subj++ ;
}
subi++ ;
}
det + = sign * mat[ 0 ] [ f] * determinant( temp, n- 1 ) ;
sign = - sign;
}
return det;
}
// Function to get cofactor matrix for adjoint
void getCofactor( double mat[ MAX] [ MAX] , double temp[ MAX] [ MAX] , int p, int q, int n) {
int i = 0 , j = 0 ;
for ( int row= 0 ; row< n; row++ ) {
for ( int col= 0 ; col< n; col++ ) {
if ( row ! = p && col ! = q) {
temp[ i] [ j++ ] = mat[ row] [ col] ;
if ( j == n- 1 ) {
j = 0 ;
i++ ;
}
}
}
}
}
// Function to calculate adjoint
void adjoint( double mat[ MAX] [ MAX] , double adj[ MAX] [ MAX] , int n) {
if ( n == 1 ) {
adj[ 0 ] [ 0 ] = 1 ;
return ;
}
double temp[ MAX] [ MAX] ;
int sign = 1 ;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
getCofactor( mat, temp, i, j, n) ;
sign = ( ( i+ j) % 2 == 0 ) ? 1 : - 1 ;
adj[ j] [ i] = sign * determinant( temp, n- 1 ) ;
}
}
}
// Function to calculate inverse
void inverse( double mat[ MAX] [ MAX] , double inv[ MAX] [ MAX] , int n, double det) {
double adj[ MAX] [ MAX] ;
adjoint( mat, adj, n) ;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
inv[ i] [ j] = adj[ i] [ j] / det;
}
int main( ) {
int n;
double A[ MAX] [ MAX] , B[ MAX] , X[ MAX] , Atemp[ MAX] [ MAX] , detA;
cout << "Enter the order of square matrix: " ;
cin >> n;
cout << "Enter coefficients of matrix A:\n " ;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
cin >> A[ i] [ j] ;
cout << "Enter constants of vector B:\n " ;
for ( int i= 0 ; i< n; i++ )
cin >> B[ i] ;
// Find determinant of A
detA = determinant( A, n) ;
cout << fixed << setprecision( 4 ) ;
cout << "\n Determinant of A: " << detA << endl;
if ( detA == 0 ) {
cout << "Matrix is singular; the system is not uniquely solvable.\n " ;
return 0 ;
}
// Solve using Cramer's Rule
for ( int i= 0 ; i< n; i++ ) {
// Copy A into Atemp
for ( int r= 0 ; r< n; r++ )
for ( int c= 0 ; c< n; c++ )
Atemp[ r] [ c] = A[ r] [ c] ;
// Replace i-th column with vector B
for ( int r= 0 ; r< n; r++ )
Atemp[ r] [ i] = B[ r] ;
double detAi = determinant( Atemp, n) ;
X[ i] = detAi / detA;
}
// Display solution
cout << "\n The solution using Cramer's Rule:\n " ;
for ( int i= 0 ; i< n; i++ )
cout << "x" << i+ 1 << " = " << X[ i] << endl;
// Compute and display inverse (optional)
double inv[ MAX] [ MAX] ;
inverse( A, inv, n, detA) ;
cout << "\n Inverse of matrix A:\n " ;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ )
cout << setw( 8 ) << inv[ i] [ j] << " " ;
cout << endl;
}
return 0 ;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGlvbWFuaXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYID0gMTA7CgovLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXRyaXgKZG91YmxlIGRldGVybWluYW50KGRvdWJsZSBtYXRbTUFYXVtNQVhdLCBpbnQgbikgewogICAgZG91YmxlIGRldCA9IDA7CiAgICBpZihuID09IDEpCiAgICAgICAgcmV0dXJuIG1hdFswXVswXTsKICAgIGlmKG4gPT0gMikKICAgICAgICByZXR1cm4gKG1hdFswXVswXSptYXRbMV1bMV0gLSBtYXRbMF1bMV0qbWF0WzFdWzBdKTsKCiAgICBkb3VibGUgdGVtcFtNQVhdW01BWF07CiAgICBpbnQgc2lnbiA9IDE7CgogICAgZm9yKGludCBmPTA7IGY8bjsgZisrKSB7CiAgICAgICAgaW50IHN1YmkgPSAwOwogICAgICAgIGZvcihpbnQgaT0xOyBpPG47IGkrKykgewogICAgICAgICAgICBpbnQgc3ViaiA9IDA7CiAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqPG47IGorKykgewogICAgICAgICAgICAgICAgaWYoaiA9PSBmKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdGVtcFtzdWJpXVtzdWJqXSA9IG1hdFtpXVtqXTsKICAgICAgICAgICAgICAgIHN1YmorKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJpKys7CiAgICAgICAgfQogICAgICAgIGRldCArPSBzaWduICogbWF0WzBdW2ZdICogZGV0ZXJtaW5hbnQodGVtcCwgbi0xKTsKICAgICAgICBzaWduID0gLXNpZ247CiAgICB9CiAgICByZXR1cm4gZGV0Owp9CgovLyBGdW5jdGlvbiB0byBnZXQgY29mYWN0b3IgbWF0cml4IGZvciBhZGpvaW50CnZvaWQgZ2V0Q29mYWN0b3IoZG91YmxlIG1hdFtNQVhdW01BWF0sIGRvdWJsZSB0ZW1wW01BWF1bTUFYXSwgaW50IHAsIGludCBxLCBpbnQgbikgewogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIGZvcihpbnQgcm93PTA7IHJvdzxuOyByb3crKykgewogICAgICAgIGZvcihpbnQgY29sPTA7IGNvbDxuOyBjb2wrKykgewogICAgICAgICAgICBpZihyb3cgIT0gcCAmJiBjb2wgIT0gcSkgewogICAgICAgICAgICAgICAgdGVtcFtpXVtqKytdID0gbWF0W3Jvd11bY29sXTsKICAgICAgICAgICAgICAgIGlmKGogPT0gbi0xKSB7CiAgICAgICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYWRqb2ludAp2b2lkIGFkam9pbnQoZG91YmxlIG1hdFtNQVhdW01BWF0sIGRvdWJsZSBhZGpbTUFYXVtNQVhdLCBpbnQgbikgewogICAgaWYobiA9PSAxKSB7CiAgICAgICAgYWRqWzBdWzBdID0gMTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZG91YmxlIHRlbXBbTUFYXVtNQVhdOwogICAgaW50IHNpZ24gPSAxOwoKICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykgewogICAgICAgIGZvcihpbnQgaj0wOyBqPG47IGorKykgewogICAgICAgICAgICBnZXRDb2ZhY3RvcihtYXQsIHRlbXAsIGksIGosIG4pOwogICAgICAgICAgICBzaWduID0gKChpK2opJTIgPT0gMCkgPyAxIDogLTE7CiAgICAgICAgICAgIGFkaltqXVtpXSA9IHNpZ24gKiBkZXRlcm1pbmFudCh0ZW1wLCBuLTEpOwogICAgICAgIH0KICAgIH0KfQoKLy8gRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGludmVyc2UKdm9pZCBpbnZlcnNlKGRvdWJsZSBtYXRbTUFYXVtNQVhdLCBkb3VibGUgaW52W01BWF1bTUFYXSwgaW50IG4sIGRvdWJsZSBkZXQpIHsKICAgIGRvdWJsZSBhZGpbTUFYXVtNQVhdOwogICAgYWRqb2ludChtYXQsIGFkaiwgbik7CgogICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKQogICAgICAgIGZvcihpbnQgaj0wOyBqPG47IGorKykKICAgICAgICAgICAgaW52W2ldW2pdID0gYWRqW2ldW2pdIC8gZGV0Owp9CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgZG91YmxlIEFbTUFYXVtNQVhdLCBCW01BWF0sIFhbTUFYXSwgQXRlbXBbTUFYXVtNQVhdLCBkZXRBOwoKICAgIGNvdXQgPDwgIkVudGVyIHRoZSBvcmRlciBvZiBzcXVhcmUgbWF0cml4OiAiOwogICAgY2luID4+IG47CgogICAgY291dCA8PCAiRW50ZXIgY29lZmZpY2llbnRzIG9mIG1hdHJpeCBBOlxuIjsKICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykKICAgICAgICBmb3IoaW50IGo9MDsgajxuOyBqKyspCiAgICAgICAgICAgIGNpbiA+PiBBW2ldW2pdOwoKICAgIGNvdXQgPDwgIkVudGVyIGNvbnN0YW50cyBvZiB2ZWN0b3IgQjpcbiI7CiAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspCiAgICAgICAgY2luID4+IEJbaV07CgogICAgLy8gRmluZCBkZXRlcm1pbmFudCBvZiBBCiAgICBkZXRBID0gZGV0ZXJtaW5hbnQoQSwgbik7CiAgICBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbig0KTsKICAgIGNvdXQgPDwgIlxuRGV0ZXJtaW5hbnQgb2YgQTogIiA8PCBkZXRBIDw8IGVuZGw7CgogICAgaWYoZGV0QSA9PSAwKSB7CiAgICAgICAgY291dCA8PCAiTWF0cml4IGlzIHNpbmd1bGFyOyB0aGUgc3lzdGVtIGlzIG5vdCB1bmlxdWVseSBzb2x2YWJsZS5cbiI7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gU29sdmUgdXNpbmcgQ3JhbWVyJ3MgUnVsZQogICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgLy8gQ29weSBBIGludG8gQXRlbXAKICAgICAgICBmb3IoaW50IHI9MDsgcjxuOyByKyspCiAgICAgICAgICAgIGZvcihpbnQgYz0wOyBjPG47IGMrKykKICAgICAgICAgICAgICAgIEF0ZW1wW3JdW2NdID0gQVtyXVtjXTsKCiAgICAgICAgLy8gUmVwbGFjZSBpLXRoIGNvbHVtbiB3aXRoIHZlY3RvciBCCiAgICAgICAgZm9yKGludCByPTA7IHI8bjsgcisrKQogICAgICAgICAgICBBdGVtcFtyXVtpXSA9IEJbcl07CgogICAgICAgIGRvdWJsZSBkZXRBaSA9IGRldGVybWluYW50KEF0ZW1wLCBuKTsKICAgICAgICBYW2ldID0gZGV0QWkgLyBkZXRBOwogICAgfQoKICAgIC8vIERpc3BsYXkgc29sdXRpb24KICAgIGNvdXQgPDwgIlxuVGhlIHNvbHV0aW9uIHVzaW5nIENyYW1lcidzIFJ1bGU6XG4iOwogICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKQogICAgICAgIGNvdXQgPDwgIngiIDw8IGkrMSA8PCAiID0gIiA8PCBYW2ldIDw8IGVuZGw7CgogICAgLy8gQ29tcHV0ZSBhbmQgZGlzcGxheSBpbnZlcnNlIChvcHRpb25hbCkKICAgIGRvdWJsZSBpbnZbTUFYXVtNQVhdOwogICAgaW52ZXJzZShBLCBpbnYsIG4sIGRldEEpOwoKICAgIGNvdXQgPDwgIlxuSW52ZXJzZSBvZiBtYXRyaXggQTpcbiI7CiAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspIHsKICAgICAgICBmb3IoaW50IGo9MDsgajxuOyBqKyspCiAgICAgICAgICAgIGNvdXQgPDwgc2V0dyg4KSA8PCBpbnZbaV1bal0gPDwgIiAiOwogICAgICAgIGNvdXQgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=