LG3389 【模板】高斯消元法 高斯消元

问题描述

LG3389


题解

高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\)

这样就构造出了这个方程组的矩阵

目标就是把这个矩阵左边\(n \times n\)消为单位矩阵



\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

void read(int &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') fh=-1,ch=getchar();
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

#define maxn 107

int n;

double a[maxn][maxn];

int pla;

int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=n+1;j++) cin>>a[i][j];
    }
    for(register int i=1;i<=n;i++){
        pla=i;
        while(pla<=n&&a[pla][i]==0) pla++;
        if(pla==n+1){//如果第i列没有非0的,显然无解
            puts("No Solution");return 0;
        }
        for(register int j=1;j<=n+1;j++) swap(a[i][j],a[pla][j]);//交换到第i行
        double tmp=a[i][i];
        for(register int j=1;j<=n+1;j++) a[i][j]=a[i][j]/tmp;//消除第i行
        for(register int j=1;j<=n;j++){
            if(i==j) continue;
            double rp=a[j][i];
            for(register int k=1;k<=n+1;k++){
                a[j][k]=a[j][k]-rp*a[i][k];//消除其他
            }
        }
    }
    for(register int i=1;i<=n;i++){
        cout<<fixed<<setprecision(2)<<a[i][n+1]<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/liubainian/p/11483289.html

时间: 2024-10-10 06:26:49

LG3389 【模板】高斯消元法 高斯消元的相关文章

【洛谷P3389】【模板】高斯消元

题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1, a2 .....an? 和 b,代表一组方程. 输出格式: 共n行,每行一个数,第 i行为 xi? (保留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≤n≤100,∣ai?

【模板】高斯消元

Gauss消元,我在线代书上学会的-- 大概就是每次把每行第一个元素消掉,直到成为上三角矩阵为止. 此时从最后一个元素反代回去,就可以求出线性方程组的解. #include<bits/stdc++.h> #define N 205 using namespace std; const double eps=1e-8; int n; double a[N][N],del; bool gauss(){ for(int i=1;i<=n;i++){ int k=i; for(int j=i+1

[ACM] POJ 2947 Widget Factory (高斯消元)

Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 4436   Accepted: 1502 Description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to

[数论] 高斯消元(整型和浮点型)

高斯消元法: 数学上,高斯消元法(或译:高斯消去法)(英语:Gaussian Elimination),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵.当用于一个矩阵时,高斯消元法会产生出一个"行梯阵式".(来自维基百科) 构造如下方程: a[0][0]*X0 + a[0][1] *X1 + a[0][2]*X2+...........a[0][n-1]*Xn-1   =  a[0][n] a[1][0]*X0 + a[1][1] *X1 + a

浅谈高斯消元的实现和简单应用

一.高斯消元的原理 对于n元的m个线性方程组成的方程组,我们将其以矩阵的形式记录下来: a11 a12 a13 ...... a1n b1 a21 a22 a23 ...... a2n b2 ... ... ... an1 an2 an3 ...... ann bn 然后进行初等行列变换,尝试构造出一个上三角矩阵,逐步使系数不为零的项减少: 等最后只剩下一个系数不为零时,进行回代,逐步求出已知解.(详解过程咨询小学老师) 二.高斯消元的实现 老老实实的回代代码参见其他人的博客,这里介绍一种比较毒

高斯消元模板(kuangbin大神版本)

#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int MOD = 7; const int MAXN = 50; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];//标记是否是不确定的

高斯消元 模板

照着czyuan的那个模板,手敲了一遍,存一下. 貌似今天一整天就看了一下高斯消元的知识,然后看了模板,又手敲了一遍. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #define LL __int64 8 const int

hdu 5755(高斯消元——模线性方程组模板)

知道了是高斯消元后,其实只要稍加处理,就可以解决带模的情况. 1 是在进行矩阵行变化的时候,取模. 2 最后的除法用逆元.(因为a[i][i]必定非0 且小于模数) 然后对于无穷多解的情况,只需要将那些列全为0的未知数定义一个固定值.(这里设的是0)其余操作不变. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath&g

高斯消元模板

高斯消元: 其实就是用矩阵初等变换解线性方程组,只是他要求每次选取的主元一定要是最大值. 模板 #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; const int MAXN=10000; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];/