问题
求解线性方程组
算法思想
高斯消元法的实现主要分为两种,一种是普通的高斯消元,将系数矩阵消为上三角矩阵,再一步步回代求出所有未知数;第二种是高斯-约旦消元法,将系数矩阵消为对角矩阵,不需要回代即可直接解出未知数,这里展示第二种做法。
代码实现
例题:P3389 【模板】高斯消元法
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#define il inline
#define ll long long
#define db double
using namespace std;
il int read(){
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
return x*f;
}
const int N=110;
int n;
db a[N][N];
int Guass(){
for(int i=1;i<=n;i++){
int mx=i;
for(int j=i+1;j<=n;j++){
if(fabs(a[mx][i])<fabs(a[j][i])) mx=j;
}
for(int j=1;j<=n+1;j++) swap(a[mx][j],a[i][j]);
if(!a[i][i]) return 0;
for(int j=1;j<=n;j++){
if(i!=j){
db d=a[j][i]/a[i][i];
for(int k=i+1;k<=n+1;k++){
a[j][k]-=a[i][k]*d;
}
}
}
}
return 1;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
a[i][j]=read();
}
}
int f=Guass();
if(!f) printf("No Solution");
else{
for(int i=1;i<=n;i++){
printf("%.2lf\n",a[i][n+1]/a[i][i]);
}
}
return 0;
}
标签:ch,矩阵,高斯消,include,元法,define
From: https://www.cnblogs.com/imyhy/p/17726075.html