P3389 【模板】高斯消元法

P3389 【模板】高斯消元法

题目背景

Gauss消元

题目描述

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

输入输出格式

输入格式:

 

第一行,一个正整数 nn

第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 cdots a_na1,a2an 和 bb,代表一组方程。

 

输出格式:

 

共n行,每行一个数,第 ii行为 x_ixi (保留2位小数)

如果不存在唯一解,在第一行输出"No Solution".

 

输入输出样例

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

说明

1 leq n leq 100, left | a_i ight| leq {10}^4 , left |b ight| leq {10}^41n100,ai104,b104

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n;
double f[101][101],ans[101];
const double eps=1e-12;

int dcmp(double x)
{
    if(x<=eps && x>=-eps) return 0;
    return (x>0)?1:-1;
}

bool gauss()
{
    for(int i=1;i<=n;i++)
    {
        int num=i;
        for(int j=i+1;j<=n;j++)
          if(dcmp(f[i][j]-f[num][i])>0)
            num=j;
        if(num!=i)
          for(int j=1;j<=n+1;j++)
            swap(f[i][j],f[num][j]);
        for(int j=i+1;j<=n;j++)
          if(dcmp(f[j][i]))
          {
                double t=f[j][i]/f[i][i];
                for(int k=1;k<=n+1;k++)
                  f[j][k]-=t*f[i][k];
          }
    }
    
    for(int i=n;i>=1;i--)
    {
        if(dcmp(f[i][i])==0) return 0;
        for(int j=i+1;j<=n;j++) f[i][n+1]-=f[i][j]*ans[j];
        ans[i]=f[i][n+1]/f[i][i];
    }return 1;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n+1;j++)
        scanf("%lf",&f[i][j]);
        
    if(gauss())
      for(int i=1;i<=n;i++)
        printf("%.2lf
",ans[i]);
    else puts("No Solution
");
    return 0;
}
折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
原文地址:https://www.cnblogs.com/L-Memory/p/7799657.html