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 \right| \leq {10}^4 , \left |b \right| \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\n",ans[i]);
    else puts("No Solution\n");
    return 0;
}

 

posted @ 2017-11-07 16:37  安月冷  阅读(215)  评论(0编辑  收藏  举报