洛谷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<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
",a[i][n+1]);
    }
}

 

原文地址:https://www.cnblogs.com/thmyl/p/8084605.html