P3389 【模板】高斯消元法

我们需要的是解方程组

手解怎么解,挨个试呗

所以说呢,电脑也可以干一样的事情

(x_1)(x_n)一个一个得消去系数,然后倒着推回来

这里的问题很简单,不需要考虑自由元什么的

所以说搞就行了

在这里呢,我们把(1 ightarrow n)的系数依次搞成零

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
int n;
double a[105][105],ans[105];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
        cin>>a[i][n+1];
    }
    for(int i=1;i<=n;i++){
        int r=i;
        for(int j=i+1;j<=n;j++){
            if(fabs(a[r][i])<fabs(a[j][i])) r=j;//为了精度
			//从大的开始搞 
        }
        if(i!=r) for(int j=i;j<=n+1;j++) swap(a[i][j],a[r][j]);
        for(int j=i+1;j<=n;j++){
            for(int k=i+1;k<=n+1;k++){
                a[j][k]=a[j][k]-a[j][i]/a[i][i]*a[i][k];
                //手推一下
				//自己消元的过程 
            }
            a[j][i]=0;
            //这一项没了 
        }
    }
    for(int i=n;i>=1;i--){
        if(a[i][i]==0){
            cout<<"No Solution";
            return 0;
        }
        ans[i]=a[i][n+1]/a[i][i];
        for(int j=1;j<i;j++){
            a[j][n+1]-=a[j][i]*ans[i];
        }
    }
    for(int i=1;i<=n;i++) cout<<fixed<<setprecision(2)<<ans[i]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/For-Miku/p/14906330.html