先出裸的模板:

#include<bits/stdc++.h>using namespace std;
const int N = 110;
typedef double db;
db a[N][N];
const db eps = 1e-8;
int n;int gauss()
{int c,r;for(c=0,r=0;c<n;++c)/***************/{int t = r;for(int i=r+1;i<n;++i) if(fabs(a[i][c])>fabs(a[r][c])) t = i;/************/if(fabs(a[t][c])<eps) continue;for(int i=c;i<n+1;++i) swap(a[r][i],a[t][i]);/***************/for(int i=n;i>=c;--i) a[r][i]/=a[r][c];for(int i=r+1;i<n;++i){if(fabs(a[i][c])>eps){for(int j=n;j>=c;--j){a[i][j]-=a[r][j]*a[i][c];/******************/}}}++r;}if(r<n){for(int i=r;i<n;++i) if(fabs(a[i][n])>eps) return 1;/*****************/return 2;}/********************/for(int i=n-1;i>=0;--i){for(int j=i+1;j<n;++j){a[i][n]-=a[i][j]*a[j][n];}}return 0;
}int main()
{cin>>n;for(int i=0;i<n;++i){for(int j=0;j<n+1;++j){cin>>a[i][j];}}int t = gauss();if(t==2){cout<<"Infinite group solutions"<<endl;}else if(t==1) cout<<"No solution"<<endl;else{for(int i=0;i<n;++i){if(fabs(a[i][n])<eps) a[i][n]=0;/******************/printf("%.2lf\n",a[i][n]);}}return 0;
}

输入一个包含 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

初等行列变化:

1.某一行乘上一个非零数,矩阵不变
2.某一行乘上一个常数加到另一行上,矩阵不变
3.交换矩阵中某两行的元素,矩阵不变

思路:利用初等行列变化初等行列变化将矩阵变换成上三角形矩阵,再由后往前推出解

上三角形矩阵带来的结果有三种:无解,有唯一解,无穷多解

无解:若在最后化成的上三角形矩阵中,正对角线中某个元素为0,但其所在行的最后一列元素不为0时,此时矩阵无解

有无数解:若在最后化成的上三角形矩阵中,存在正对角线中某个元素为0,且其所在行的最后一列元素也为0时,此时矩阵有无穷组解

有唯一解:若在最后化成的上三角形矩阵中,不存在正对角线中某个元素为0,此时矩阵有唯一解

算法步骤

1.枚举每一列c,找到当前列绝对值最大的一行

2.用初等行变换(2) 把绝对值最大的这一行换到最上面(注意:“最上面”指的是未确定阶梯型的行,而不是第一行)

3.用初等行变换(1) 将该行的第一个数变成 1 (其余所有的数字依次跟着变化)

4.用初等行变换(3) 将下面所有行的当前列的值变成 0

对于行的元素改变操作,总是按列倒序遍历
#include<bits/stdc++.h>using namespace std;
typedef double db;
const int N = 110;
/*  C++浮点数存在误差,不能直接判断0,要判断是否小于一个很小的数,如果小于这个很小的数,就认为是0,如小于1e-6*/
const db eps = 1e-8;int n;
db a[N][N];int gauss()// 高斯消元,答案存于a[i][n]中,0 <= i < n
{int c,r;for(c = 0,r = 0;c < n; ++c)//上界是小于n,因为是枚举系数矩阵的列{int t = r;// ① 找到当前这一列中绝对值最大的一行for(int i = r; i < n; ++i){if(fabs(a[i][c])>fabs(a[t][c])) t = i;}// 如果这一列中最大值已经是0了,直接continue进入下一列if(fabs(a[t][c])<eps) continue;//剪枝// ② 将这行换到最上面for(int i = c; i <= n; ++i) swap(a[t][i],a[r][i]);// 将绝对值最大的行换到最顶端// ③ 将该行第一个数变成1// 将r行中c列后的每一个元素除上一个a[r][c](该行的第一个不为零的元素)for(int i = n; i >= c; --i) a[r][i]/=a[r][c];// 将当前行的首位变成1for(int i = r+1; i < n; ++i)// 用当前行将下面所有的列消成0{if(fabs(a[i][c])>eps)//剪枝{for(int j = n; j >= c; --j){// a[r][j]当前这行的第j列元素,a[i][c]是下面行的最前面的元素//目的是把第r+1行~n行的第c列元素都消除为0a[i][j] -= a[r][j] * a[i][c];//联想学线代怎么做的就行}}}++r;}if(r<n)// 无解和无穷多解的判断{// 如果出现了等号左右一个为0一个非0,则说明无解for(int i = r; i < n; ++i)if(fabs(a[i][n])>eps) return 2;// 无解// 否则说明有无穷多解return 1;// 有无穷多组解}// 回溯计算每个值xifor(int i = n-1; i >= 0; --i)for(int j = i+1; j < n; ++j)a[i][n] -= a[i][j] * a[j][n];
//a[j][n]即代表之前循环已经求出来的未知数xj,a[i][j]代表当前枚举到的第i行中xj的系数,简单解个方程就行return 0;// 有唯一解
}int main()
{cin>>n;// 存储线性方程组的增广矩阵for(int i=0;i<n;++i){for(int j=0;j<n+1;++j){cin>>a[i][j];}}int t = gauss();// 执行高斯消元if(t==2) cout<<"No solution"<<endl;// 否则无解else if(t==1) cout<<"Infinite group solutions"<<endl;// 如果 t = 1,线性方程组存在无数解else{for(int i=0;i<n;++i){if(fabs(a[i][n])<eps) a[i][n] = 0;// 去掉输出 -0.00 的情况printf("%.2lf\n",a[i][n]);// %.2lf 保留两位小数}}return 0;
}

AcWing 883. 高斯消元解线性方程组(高斯消元模板)相关推荐

  1. AcWing 883. 高斯消元解线性方程组 (高斯消元)

    题目链接 : 点击查看 题目描述 : 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n 个未知数的线性方程组示例: 输入输 ...

  2. AcWing - 高斯消元解线性方程组(高斯消元)

    题目链接:https://www.acwing.com/problem/content/885/ 时/空限制:1s / 64MB 题目描述 输入一个包含n个方程n个未知数的线性方程组. 方程组中的系数 ...

  3. [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题

    [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算 ...

  4. 高斯消元 AcWing 883. 高斯消元解线性方程组

    高斯消元 AcWing 883. 高斯消元解线性方程组 原题链接 AcWing 883. 高斯消元解线性方程组 算法标签 线性代数 高斯消元 思路 代码 #include<bits/stdc++ ...

  5. 第三十四章 数论——高斯消元解线性方程组

    第三十四章 数论--高斯消元解线性方程组 一.高斯消元 1.线性方程组 2.高斯消元步骤 (1)数学知识铺垫 增广矩阵和阶梯矩阵 初等变换 (2)高斯消元步骤 二.代码模板 1.问题: 2.代码 一. ...

  6. 解线性方程组——高斯消元の板子

    ATP记得它在很久以前看过一点点高斯消元的东西然后做过一点点题目..但是当时实在是太zz了所以本来就没有很懂这个东西现在更是忘得差不多了.. 所以现在就当重新学一遍了QwQ 一点口胡的解释 高斯消元. ...

  7. 高斯消元——解线性方程组+球形空间产生器+开关问题

    传送门:https://www.acwing.com/activity/content/11/ 思路: 把原矩阵变成阶梯型矩阵解题步骤: 1.找到绝对值最大的一行. 2.将该行和最上面未处理好的一行交 ...

  8. 高斯消元解线性方程组(浮点高斯消元模板)

    题目连接 https://www.acwing.com/problem/content/885/ 思路 高斯消元的思路如下: 1.我们从上到下,从左到右开始消元,对于每一行我们只保留当前[i,i]行的 ...

  9. 高斯列主元消去法解线性方程组

    最近在看惯导的东西,然后想要用C++解惯导控制方程,然后就重头把C++解方程组这方面的知识回顾了一下,首先就是高斯列主元消去法,这个方法还算实用,这里以3*3的矩阵为例,里面注释很详细,各位小白可以参 ...

最新文章

  1. hiernate的锁机制
  2. Application Performance Management Monitoring | New Relic
  3. CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)
  4. Code Signal_练习题_extractEachKth
  5. ElasticSearch 动态映射与静态映射_08
  6. 前端实现动画的6种方式详解
  7. C++封装SQLite实例六
  8. 中英文字体对照表-参考
  9. 抖音直播违规行为与敏感词处罚,直播必备干货大全丨国仁网络
  10. Tomcat导入J2EE项目教程
  11. 软考软件设计师中java题_计算机基础试题整理与解析-软考中级软件设计师
  12. 安装好的java在哪里打开_安装了java怎么打开jar
  13. 数据结构期末考题总结(附答案)
  14. python---录制音频
  15. 微信公众号修改业务域名、JS接口安全域名、网页授权域名
  16. python import 类如何捕获clrt c_PEP8 python规范神器
  17. STM32F4 IAP实现总结
  18. Java解压压缩加密文件zip
  19. TIOBE 11 月编程语言:Java 首次跌出前二;基于Pytorch的Kornia可微分计算机视觉库开源...
  20. php中如何导出表格,PHP如何实现表格Excel的导出

热门文章

  1. 怎样学习ISO 14229和ISO 15765?
  2. 明略数据SCOPA发布 开启大数据关联挖掘的新时代
  3. 一百块打八折怎么用计算机算,打折怎么算是乘还是除(举例说明100元打8.8折算法)...
  4. 三大运营商的网络制式
  5. 根文件系统(四)——U盘文件系统制作
  6. 【PCIe 6.0】PCIe Shared Flow Control (5) - Optimized FC
  7. 初识Linux:第五篇
  8. 解锁网易云音乐的灰色歌曲、会员歌曲
  9. mybatis-generator自动生成Java的CRUD等代码的独立包使用详解
  10. 用python画一只可爱的布朗熊