[SDOI2006]线性方程组(高斯消元模板)

[SDOI2006]线性方程组(luogu)

Solution

人间迷惑行为——省选考模板?

高斯消元跑一遍

若每一个未知数分别为一个式子的主元——输出答案

否则看各项系数都为0的式子等号右边是否为0,

若为0,有无数解;否则无解

Code

 

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define db double
using namespace std;
const int N=60;
db a[N][N],eps=1e-8;
int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            scanf("%lf",&a[i][j]);
        scanf("%lf",&a[i][0]);
    }
    int del=0;
    for(int i=1;i<=n;i++)
    {
        int now=0;
        for(int j=del+1;j<=n;j++)
            if(fabs(a[j][i])>eps)
            {
                now=j;
                break;
            }
        if(!now) continue;
        del++;
        for(int j=0;j<=n;j++) swap(a[now][j],a[del][j]);
        for(int j=1;j<=n;j++)
        {
            if(j==del) continue;
            double rate=a[j][i]/a[del][i];
            for(int k=0;k<=n;k++) a[j][k]-=a[del][k]*rate;
        }
    }
    if(del==n)
        for(int i=1;i<=n;i++) printf("x%d=%.2lf\n",i,a[i][0]/a[i][i]);
    else
    {
        bool flag=true;
        for(int i=del+1;i<=n;i++)
            if(fabs(a[i][0])>eps)
            {
                flag=false;
                break;
            }
        if(flag) puts("0");
        else puts("-1");
    }
    return 0;
}

 

 

猜你喜欢

转载自www.cnblogs.com/hsez-cyx/p/12426845.html