洛谷P3389 【模板】高斯消元法

来源:互联网 发布:淘宝神舟昆山工厂店 编辑:程序博客网 时间:2024/05/17 08:54

题目描述

给定一个线性方程组,对其求解。

输入样例#1:
3
1 3 4 5
1 4 7 3
9 3 2 2
输出样例#1:
-0.97
5.18
-2.39

分析:对于第i个方程用它的第i个元消掉第i+1个方程后面每个方程的第i个元,如果第i个方程的i消为0则此方程组有无穷解或无解,这样到最后一个方程只有一个元,然后往上解就好了。

代码

#include <cstdio>#define N 200using namespace std;double a[N][N],b[N];int n;bool fl;void work(int m){    if (m==n)     {        b[n]=a[n][n+1]/a[n][n];        return;    }    for (int i=m+1;i<=n;i++)    {        double p=a[i][m]/a[m][m];        for (int j=m;j<=n+1;j++)        {            a[m][j]*=p;            a[i][j]-=a[m][j];        }        if (a[i][i]==0)        {            fl=true;            return;        }    }       work(m+1);}void get(int m){    if (m==0) return;    double p=0;    for (int i=m+1;i<=n;i++)        p+=a[m][i]*b[i];    b[m]=(a[m][n+1]-p)/a[m][m];    get(m-1);}void gauss(){    work(1);    if (fl)    {        printf("No Solution");        return;    }    get(n-1);    for (int i=1;i<=n;i++)        printf("%.2lf\n",b[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();}