代码用到线性代数中与行列式有关的三个性质:
1.行列式的某一行乘以K加到行列式的另一行,行列式的结果不变;
2.行列式的某两列互换,此时行列式的结果是原行列式结果的相反数
3.若行列式的某一行全为零,则行列式的结果为零。
#include<iostream>
#include"cmath"
using namespace std;
int main()
{
int n,g=0; //n表示阶数 ,g是计数器记录换了几次列
double k1=0; //k1表示第五个性质的k系数
cout<<"输入行列式阶数:";
cin>>n;
double a[n+1][n+1]={0}; //第零行第零列 不要 从一开始
cout<<"输入行列式:" <<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
cout<<"-----------------"<<endl;
for(int j=1;j<n;j++) //j为列数,从左开始
{
for(int i=j+1;i<=n;i++) //i为行数,从上开始
{
if(a[j][j]==0) //如果k系数的分母为零,则需先换合适的列再进行操作
{ //换行操作没有换列简单,下面有所体现
g++;
int B,flag=0;
for(int b=j+1;b<=n;b++)
{
if(a[j][b]!=0)
{
B=b; //第j列与第B列交换
flag=1;
break;
}
}
if(flag)
{
printf("第%d列与第%d列互换\n",j,B);
for(int x=1;x<=n;x++)
{
double t;
t=a[x][j];
a[x][j]=a[x][B];
a[x][B]=t;
}
}
else //找不到合适的列,说明此时该行的元素全为零,行列式的结果为零
//(对角线元素为零,左边元素为零,右边元素也都是零,行列式结果为零)
{ //换行不会有换列这么简单
printf("结果为0");
return 0;
}
}
double k1=-a[i][j]/a[j][j]; //k系数的分母为对应列的对角线元素,
//分子为对应列下当前行所确定的要变为零的元素,再乘负一
for(int k=1;k<=n;k++) //k为第i行下的第k项
{
a[i][k]+=k1*a[j][k];
}
printf("\n第%d列第%d行:r%d+=k*r%d\n",j,i,i,j);
for(int m=1;m<=n;m++)
{
for(int p=1;p<=n;p++)
{
cout<<a[m][p]<<'\t';
}
printf("\n\n");
}
printf("-----------------\n");
}
}
double res = 1;
for(int i=1;i<=n;i++)
{
res*=a[i][i];
}
double k2=pow(-1,g);
printf("列互换了%d次,需再乘%.0f\n",g,k2);
cout<<"行列式计算结果:"<<res*k2<<endl;
return 0;
}