码迷,mamicode.com
首页 > 其他好文 > 详细

P3389 【模板】高斯消元法

时间:2017-11-07 18:01:04      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:msu   solution   code   reset   gauss消元   ios   family   cst   mil   

P3389 【模板】高斯消元法

题目背景

Gauss消元

题目描述

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

输入输出格式

输入格式:

 

第一行,一个正整数 nn

第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdots a_na1?,a2??an? 和 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,ai?104,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;
}

 

P3389 【模板】高斯消元法

标签:msu   solution   code   reset   gauss消元   ios   family   cst   mil   

原文地址:http://www.cnblogs.com/L-Memory/p/7799657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!