- 问题描述
- 提示信息
B. 消元结果直接存储在系数矩阵中
C. 当消元过程发生两行对调的情况为偶数次时,行列式值为对角线乘积,否则为对角线乘积的相反数。
- 基本公式
- 算法实现
#include <iostream>
#include <limits>
#include <iomanip>
#include <math.h>
using namespace std;
//定义二维数组保存行列式
double data[100][100];
//定义行列式行交换次数
int count = 0;
//保存行列式的行数和列数
int N;
//保存输入数据
void savaData();
//检测列主元最大值,并返回相应的行索引
int check(int index);
//交换行列式的两行
bool isExchange(int N);
//核心函数,进行选主元,行消元
double gauss();
//输出变性后的对角矩阵
void print();
int main()
{
savaData();
double result = gauss();
print();
cout<<"行列式计算结果为:"<<result<<endl;
return 0;
}
//保存输入数据
void savaData()
{
double x;
cout<<"请输入行列式的行数或列数:";
cin>>N;
cout<<"请输入行列式:"<<endl;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
{
cin>>x;
data[i][j] = x;
}
}
}
//检测列主元最大值,并返回相应的行索引
int check(int index)
{
int rowIndex = index;
double maxValue = 0;
for(int i=index;i<N;i++){
if(fabs(data[i][index])>fabs(maxValue)){
maxValue = data[i][index];
}
}
for(int i=index;i<N;i++){
if(data[i][index]== maxValue){
rowIndex = i;
break;
}
}
return rowIndex;
}
//交换行列式的两行
bool isExchange(int index)
{
double temp[100] = {0};
int rowIndex = check(index);
if(rowIndex != index && index < rowIndex < N){
for(int i = index ; i<N;i++)
{
temp[i] = data[rowIndex][i];
}
for(int i = index ; i<N;i++){
data[rowIndex][i] = data[index][i];
}
for(int i = index ; i<N;i++){
data[index][i] = temp[i];
}
return true;
}
return false;
}
//核心函数,进行选主元,行消元
double gauss()
{
double temp[100] = {0};
for(int i=0;i<N-1;i++){
//如果交换,则次数加1
if(isExchange(i))
{
count+=1;
}
//以data[i][i]为左上角,进行向下消元
for(int k=1;k<N-i;k++){
for(int t = i;t<N;t++){
temp[t] = -(data[i+k][i])/data[i][i]*data[i][t];
}
for(int t = i;t<N;t++){
data[i+k][t] = temp[t]+data[i+k][t];
}
}
}
//计算结果
double result = 1;
for(int i=0;i<N;i++)
{
result*=data[i][i];
}
return pow(-1,count)*result;
}
//输出变型后的对角矩阵
void print()
{
cout<<"消元后对角矩阵为:"<<endl;
for(int i=0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
cout<<setiosflags(ios::fixed);
cout<<setprecision(3)<<data[i][j]<<" ";
}
cout<<endl;
}
}
- 运行截图