洛谷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<cmath>
#define maxn 110
#define eps 0.000000001
using namespace std;
int n;
double a[maxn][maxn];
void guass(){
    for(int i=1;i<=n;i++){//枚举每个未知量 
        int p=i;
        for(int j=i+1;j<=n;j++)
            if(fabs(a[j][i])>fabs(a[p][i]))p=j;//查找哪一个式子中的该未知量系数最大 
        for(int j=1;j<=n+1;j++)swap(a[i][j],a[p][j]);//让它成为第i个式子 
        double tmp=a[i][i];//系数化为一用 
        if(fabs(tmp)<eps)continue;//因为后面涉及到除法操作,不允许0的存在 
        for(int j=1;j<=n+1;j++)a[i][j]/=tmp;
        for(int j=1;j<=n;j++){
            if(j==i)continue;
            double tmp=a[j][i];
            for(int k=1;k<=n+1;k++){
                a[j][k]-=tmp*a[i][k];
            }
        }
    }
}
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);
    guass();
    bool wujie=0,duojie=0;
    for(int i=1;i<=n;i++){//枚举每个等式 
        int cnt=0;
        for(int j=1;j<=n+1;j++){
            if(fabs(a[i][j])<eps)cnt++;
            else break;
        }
        if(cnt==n)wujie=1;
        if(cnt==n+1)duojie=1;
    }
    if(wujie||duojie){puts("No Solution");return 0;}
    for(int i=1;i<=n;i++){
        printf("%.2lf\n",a[i][n+1]);
    }
}

 

 

posted @ 2017-12-22 09:48  Echo宝贝儿  阅读(315)  评论(0编辑  收藏  举报