洛谷-P3389-高斯消元模板

链接:

https://www.luogu.org/problem/P3389

题意:

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

思路:

高斯消元,从第一项消到最后一项,消成一个上三角矩阵.再从最后一项依次向上回带.
在消每一项的时候找到系数最大的一项开始消,将其系数置位1,再向下消,具体做法百度太多了.

代码:

#include <bits/stdc++.h>
using namespace std;

double Map[110][110];
double ans[110];
double eps = 1e-7;
int n;


bool Guess()
{
    for (int i = 1;i <= n;i++)
    {
        int ml = i;
        for (int j = i+1;j <= n;j++)
        {
            if (fabs(Map[ml][i]) < fabs(Map[j][i]))
                ml = j;
        }
        if (fabs(Map[ml][i]) < eps)
            return false;
        if (ml != i)
            swap(Map[ml], Map[i]);//换行
        double div = Map[i][i];
        for (int j = i+1;j <= n+1;j++)
            Map[i][j] /= div;//讲要消的列系数变为1
        for (int j = i+1;j <= n;j++)
        {
            div = Map[j][i];//消的值对应系数
            for (int k = i;k <= n+1;k++)
                Map[j][k] -= div*Map[i][k];//消元
        }
    }
    ans[n] = Map[n][n+1];
    //回带
    for (int i = n-1;i >= 1;i--)
    {
        ans[i] = Map[i][n+1];
        for (int j = i+1;j <= n;j++)
            ans[i] -= (Map[i][j]*ans[j]);
    }
}

int main()
{
    scanf("%d", &n);
    for (int i = 1;i <= n;i++)
    {
        for (int j = 1;j <= n+1;j++)
            scanf("%lf", &Map[i][j]);
    }
    if (Guess())
    {
        for (int i = 1;i <= n;i++)
            printf("%.2lf
", ans[i]);
    }
    else
        printf("No Solution");

    return 0;
}
原文地址:https://www.cnblogs.com/YDDDD/p/11452617.html