P3389 【模板】高斯消元法

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

高斯消元法是一个用来求解线性方程组的算法

说白了就是解n元一次方程组
用到的原理也和初中学的如出一辙,主要用到了加减消元和带入消元;
首先用加减消元将方程组消为第i个方程有n-i个未知数的状态,这样最后一个方程(n-1)只有一个未知数,解是确定的;
而倒数第二个方程有两个未知数,其中一个在最后一个方程中已经解出了,以此类推即可将所有的解都解出来
代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
double a[110][110];
int n;
int f;
void gauss()
{
    for(int i=0;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(r!=i)
            for(int j=0;j<=n;j++)//将最大的交换到上面
                swap(a[r][j],a[i][j]);
        for(int j=n;j>=i;j--)//加减消元
        {
            for(int k=i+1;k<n;k++)
                a[k][j]-=a[k][i]/a[i][i]*a[i][j];
        }
    }
    for(int i=n-1;i>=0;i--)//从最后向前回代
    {
        for(int j=i+1;j<n;j++)
        {
            a[i][n]-=a[j][n]*a[i][j];
        }
        if(a[i][i]==0)
            f=0;
        else
            a[i][n]/=a[i][i];
    }
}

int main()
{
    //ios::sync_with_stdio(false);
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    f=1;
    gauss();
    if(!f)
    {
        cout<<"No Solution"<<endl;
        return 0;
    }
    for(int i=0;i<n;i++)
    {
        printf("%.2f\n",a[i][n]);
    }
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注