高斯消元
本题详解可以看y总视频,做题首先是四大步骤,完成后进行特判三种情况
如果有唯一解在从最后一行向上进行消元
本题调试了很长时间,里边的一些数据fabs()和int ,double类型一定要搞清楚
代码:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=110;
double a[N][N];
const double res=1e-8;
int n;
int guss(){
int r;//行
int c;//列
for(r=0,c=0;c<n;c++){ //注意:c小于n不能取到n
//枚举每一列
int t=r;
//把当前行记录下来
for(int i=r+1;i<n;i++){
if(fabs(a[i][c])>fabs(a[t][c])){
t=i;
}
}
if(fabs(a[t][c])<res){
//当前列的所有行值为0
continue;
//进入到下一列
}
for(int j=c;j<=n;j++){
swap(a[t][j],a[r][j]);//将当前列最大的一行交换至当前的最前边的行位置
}
//r行为当前列的最大值
for(int j=n;j>=c;j--){
a[r][j]/=a[r][c];
//将当前行的第c列数置为1
}
for(int i=r+1;i<n;i++){
if(fabs(a[i][c])>res)
//这个地方如果不加上fabs()最后结果是错的!!!!
for(int j=n;j>=c;j--){
a[i][j]-=a[r][j]*a[i][c];
//从后向前依次将改行元素值与第r行元素进行不同倍数的相减使得改行第c列元素为0
}
}
r++;
}
if(r<n){
for(int i=r;i<n;i++){
if(fabs(a[i][n])>res){
return 2;
}
}
return 1;
}
//从下往上消元
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
a[i][n]-=a[j][n]*a[i][j];
}
}
return 0;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++){
cin>>a[i][j];
}
}
int t=guss();
if(t==0){
//有唯一解
for(int i=0;i<n;i++){
if (fabs(a[i][n]) < res)
//进行特判,如果最后结果为-0.00!!!!
a[i][n] = 0;
printf("%.2lf\n",a[i][n]);
}
}
else if (t==1){
//无数解
cout<<"Infinite group solutions"<<endl;
}
else{
//无解
cout<<"No solution"<<endl;
}
return 0;
}
高斯消元不是线性代数吗
,为啥编程会用这个,真的是好奇怪呀