(模板)高斯消元法模板

柔情痞子 提交于 2019-12-02 21:38:13

题目链接:https://www.luogu.org/problem/P3389

题意:解方程数为n(<=100)的线性方程组的解。

思路:高斯消元法模板题,复杂度:O(n^3)。

AC代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

const double eps=1e-8;
const int maxn=105;
int n;
double a[maxn][maxn],ans[maxn];

void Gauss(){
    for(int i=1;i<=n;++i){
        int r=i;
        for(int j=i+1;j<=n;++j)
            if(fabs(a[j][i])>fabs(a[r][i]))
                r=j;
        if(fabs(a[r][i])<eps){
            printf("No Solution\n");
            return;
        }
        if(r!=i) swap(a[i],a[r]);
        double div=a[i][i];
        for(int j=i;j<=n+1;++j)
            a[i][j]/=div;
        for(int j=i+1;j<=n;++j){
            div=a[j][i];
            for(int k=i;k<=n+1;++k)
                a[j][k]-=div*a[i][k];
        }
    }
    ans[n]=a[n][n+1];
    for(int i=n-1;i>=1;--i){
        ans[i]=a[i][n+1];
        for(int j=i+1;j<=n;++j)
            ans[i]-=a[i][j]*ans[j];
    }
    for(int i=1;i<=n;++i)
        printf("%.2f\n",ans[i]);
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n+1;++j)
            scanf("%lf",&a[i][j]);
    Gauss();
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!