Acwing 883高斯消元法的运用

解线性方程组

Acwing 883

输入一个包含 n 个方程 n 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 m 个方程 n 个未知数的线性方程组示例:

输入格式

第一行包含整数 n。

接下来 n 行,每行包含 n+1 个实数,表示一个方程的 n 个系数以及等号右侧的常数。

输出格式

如果给定线性方程组存在唯一解,则输出共 n 行,其中第 i 行输出第 i 个未知数的解,结果保留两位小数。

如果给定线性方程组存在无数解,则输出<Infinite group solutions>

如果给定线性方程组无解,则输出 <No solution>

数据范围

1≤n≤100,

所有输入系数以及常数均保留两位小数,绝对值均不超过 100

输入样例:

3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00

输出样例:

1.00
-2.00
3.00

Train of thought

根据线性代数高斯消元求解线性方程组的方法:

从每一列的角度考虑,先找出每一列中绝对值最大的数

然后把这个数所对应行与对应要处理的行交换,我们要做的就是尽可能地将它化为阶梯型矩阵

如:按照样例来分析

所对应的增广矩阵变化为

现在我们的任务是处理第一行,将第一行第一列归一以后把下面每行第一个数消掉

所以原矩阵变为

可以看到第一列的任务已经完成了,下面开始处理第二行,后面的思路以此类推

最后应化为上三角矩阵

Note:

  • 由于最后处理完是上三角矩阵,如果是有解的,我们还要从最后一行来进行向上的消元,这样才能得到每一个元素的解
  • 由于计算机浮点数的不精确度,我们需要定义一个浮点数常量来判断当前的数是否为0,在本题中可以设为1e-6
  • 如果判断出当前的那一列最大的数为0;应该直接循环下一列,而待处理的行不发生改变;
  • 判断无解的情况即0 = bi,而bi通过计算不为0;

综上所述,代码如下:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
double Matrix[105][105];
int n;
double Exp = 1e-6;
int guass()
{
int c,r;
for(c = 1,r = 1; c <= n; ++c)
{
int p = r;
for(int t = r; t <= n; ++t)
if(fabs(Matrix[t][c]) > fabs(Matrix[p][c]))
p = t;//找到绝对值最大的数所对应的行
if(fabs(Matrix[p][c]) < Exp) continue;//这里对应第三点注意
for(int i = c; i <= n + 1; ++i) swap(Matrix[p][i], Matrix[r][i]);
for(int i = n + 1; i >= c; --i) Matrix[r][i] /= Matrix[r][c];//第一个系数归一
for(int i = r + 1; i <= n; ++i)
for(int j = n + 1; j >= c; --j)
if(fabs(Matrix[i][c] )> Exp)
Matrix[i][j] -= Matrix[i][c] * Matrix[r][j];//消元
r++;
}
if(r <= n)
{
for(int i = r; i <= n; ++i)
if(fabs(Matrix[i][n + 1]) > Exp)
return 1;//对应第4点注意
return 2;
}
for (int i = n ; i >= 1; i -- )
for (int j = i - 1; j >= 1; j -- )
Matrix[j][n + 1] -= Matrix[j][i] * Matrix[i][n + 1];
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n + 1; ++j)
cin >> Matrix[i][j];
int t = guass();
cout << setprecision(2) <<fixed;
if(t == 0)
for(int i = 1; i <= n; ++i)
cout << Matrix[i][n + 1] << endl;
else if(t == 1)
cout << "No solution" << endl;
else
cout << "Infinite group solutions" << endl;
return 0;
}

感谢大家的阅读,第一次写博客,有些地方做的不好的恳请大家指出,一定会多加改进( ̄▽ ̄)

Acwing 883高斯消元法的运用的更多相关文章

  1. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  2. POJ 1222 (开关问题+高斯消元法)

    题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...

  3. hdu 5833 Zhu and 772002 ccpc网络赛 高斯消元法

    传送门:hdu 5833 Zhu and 772002 题意:给n个数,每个数的素数因子不大于2000,让你从其中选则大于等于1个数相乘之后的结果为完全平方数 思路: 小于等于2000的素数一共也只有 ...

  4. ZOJ3560 Re:the Princess(高斯消元法)

    题目要读很久才能理解它的意思和笑点(如果你也看过那个笑话的话),读懂之后就会发现是一个高斯消元法的题目,对于我来说难点不在高斯消元,而在于字符串处理.先来说说题意吧: 总共有n个人,n个人都会有一段话 ...

  5. POJ1222 高斯消元法解抑或方程

    第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843 有了这种思 ...

  6. 高斯消元法~get√

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  7. 高斯消元法(Gauss Elimination)【超详解&模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  8. 集成电路883和883b有什么区别

    根据用途,元器件的质量等级可分为:用于元器件生产控制.选择和采购的质量等级和用于电子设备可靠性预计的质量等级两类,两者有所区别,又相互联系. 用于元器件生产控制.选择和采购的质量等级 元器件的质量等级 ...

  9. 腾讯机试题 AcWing 603 打怪兽

    题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...

随机推荐

  1. Scala学习——简介

    一.Scala简介 Scala 是 Scalable Language 的简写,是一门多范式的编程语言,设计初衷是实现可伸缩的语言并集成面向对象编程和函数式编程的各种特性. 二.Scala 环境搭建 ...

  2. java网络编程基础——网络基础

    java网络编程 网络编程基础 1.常用的网络拓扑结构: 星型网络.总线网络.环线网络.树形网络.星型环线网络 2.通信协议的组成 通信协议通常由3部分组成: 语义部分:用于决定通信双方对话类型 语法 ...

  3. Leetcode:169. 多数元素

    Leetcode:169. 多数元素 传送门 思路 一开始想到的一个很简单的做法就是hash法,直接利用打表记录次数再输出结果. 而利用BM算法可以令算法复杂度同样也在\(O(n)\)的情况下,将空间 ...

  4. 手把手教你实现Android编译期注解

    一.编译期注解在开发中的重要性 从早期令人惊艳的ButterKnife,到后来的以ARouter为首的各种路由框架,再到现在谷歌大力推行的Jetpack组件,越来越多的第三方框架都在使用编译期注解这门 ...

  5. 传统.NET 4.x应用容器化体验(5)

    前面几篇都是基于阿里云ECS直接玩的,有童鞋问直接用Windows Server 2019可以玩不,本篇就为你介绍一下如何给Windows Server 2019配置Docker环境. 1 准备工作 ...

  6. 2021年BI软件排名,国内外BI软件功能对比

    数据分析是帮助企业深入了解自身业务表现(例如正在做什么或哪块业务需要注意和改进)的重要元素.为了获得更直观的展现,数据分析BI软件可帮助公司通过报告.数据可视化.应用程序等从数据中获取决策数据支撑.没 ...

  7. Python - 赋值运算符

    前置知识 先了解下变量: https://www.cnblogs.com/poloyy/p/15042257.html 再了解下算术运算符: https://www.cnblogs.com/poloy ...

  8. 对一个sql的分析

    select * FROM LPEdorItem a, LCCont b, LPEdorApp c WHERE a.edoracceptno = c.edoracceptno and a.ContNo ...

  9. openssl not found 离线安装的openssl问题

    离线安装问题 正常我们在Linux中按照 nginx的openssl依赖都是通过 yum来安装的,但是由于一些特殊的服务器公司不让服务器连接互联网,所以就导致我们必须通过离线方式来进行安装,但是我们离 ...

  10. 在Mac上安装Istio并使用,有丰富的监控Kiali、Grafana、Jaeger

    我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 简介 之前在文章<服务网格Istio入门-详细记录Kubernetes安装Istio并使用 ...