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. Python+pytest知识点回顾

    pip install pytest pytest 单元测试框架 pytest高于unittest测试框架 unittest测试类需要继承unittest.TestCase类 pytest不需要继承, ...

  2. 7Java基础补充

    1.标准Java bean写法 包括:private修饰的成员变量.getter和setter以及无参和有多个参数的有参构造方法 2.String原理 String底层是字节数组byte[]. Str ...

  3. 【JavaWeb】请求和响应Request&Response

    请求 请求对象 关于请求 顾名思义,意思就是请求一个"对象" 请求不到的,别想了 请求,就是使用者希望从服务器端索取一些资源,向服务器发出询问.在B/S架构中,就是客户浏览器向服务 ...

  4. Laravel使用artisan快速实现表单的登陆注册

    1. 开发环境 macOS Mojave 10.14.6 XAMPP 5.6.38 Laravel 5.2 2. 在终端,先进入到项目根目录并执行执行命令 php artisan make:auth ...

  5. Python urllib翻译笔记一

    22.5.urllib- URL处理模块urllib 是一个收集几个模块以处理URL的包: urllib.request 用于打开和阅读URL urllib.error 包含由urllib.reque ...

  6. PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制

    ‍PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制 中文 | English 项目地址:An awesome version control t ...

  7. 深入刨析tomcat 之---第10篇 how tomcat works 第13章,Response 发送错误信息 sendError

    writedby 张艳涛 在浏览器中发送一个错误应用url 那么tomcat是如何发送错误的呢? 基本上是发送http 的response协议,分为两部分一部分是response设置头信息, 那么先分 ...

  8. vue 跨域 springCloud @CrossOrigin注解

    vue 跨域  springCloud @CrossOrigin注解 一丶什么是跨域 跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协 ...

  9. jQuery 两个日期时间相减

    var sDate='2016-10-31';var eDate='2016-10-10'var sArr = sDate.split("-");var eArr = eDate. ...

  10. Go语言常见的坑

    目录 1. 可变参数是空接口类型 2. 数组是值传递 3.map遍历是顺序不固定 4. 返回值被屏蔽 5.recover必须在defer函数中运行 6. main函数提前退出 7.通过Sleep来回避 ...