当前位置: 首页 > news >正文

69.Acwing基础课第883题-简单-高斯消元解线性方程组

69.Acwing基础课第883题-简单-高斯消元解线性方程组

题目描述

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

\(方程组中的系数为实数\)

\(求解这个方程组\)

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

\[ \begin{aligned} a_{11}x_1 + a_{12}x_2 + \dots + a_{1n}x_n &= b_1, \\ a_{21}x_1 + a_{22}x_2 + \dots + a_{2n}x_n &= b_2, \\ \cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots& \\ a_{m1}x_1 + a_{m2}x_2 + \dots + a_{mn}x_n &= b_m; \end{aligned} \]

输入格式

\(第一行包含整数 n\)

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

输出格式

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

注意:本题有 SPJ,当输出结果为 0.00 时,输出 -0.00 也会判对。在数学中,一般没有正零或负零的概念,所以严格来说应当输出 0.00,但是考虑到本题作为一道模板题,考察点并不在于此,在此处卡住大多同学的代码没有太大意义,故增加 SPJ,对输出 -0.00 的代码也予以判对。

如果给定线性方程组存在无数解,则输出 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

代码:

// 包含基础输入输出、字符串操作、算法、数学函数头文件
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;// 常量定义:
// N=110:最多支持100个未知数的线性方程组(留冗余)
// eps=1e-8:浮点数精度阈值(判断是否为0,避免浮点误差)
const int N = 110;
const double eps = 1e-8;int n;                  // n:方程组的未知数个数(也是方程个数)
double a[N][N];         // 增广矩阵:a[i][j]表示第i行第j列,最后一列a[i][n]是常数项b_i// 高斯消元核心函数:将增广矩阵化为行最简形,求解线性方程组
// 返回值:0-有唯一解 | 1-有无穷多解 | 2-无解
// 最终解(若有唯一解)存储在a[i][n]中(第i个未知数的解)
int gauss()
{int c, r; // c:当前处理的列(未知数);r:当前处理的行(方程)// 遍历每一列(逐个消去未知数)for (c = 0, r = 0; c < n; c ++ ){// ========== 步骤1:找当前列绝对值最大的行(选主元,避免除数过小导致精度误差) ==========int t = r; // 初始假设当前行是主元行for (int i = r; i < n; i ++ )if (fabs(a[i][c]) > fabs(a[t][c]))t = i; // 更新为主元行(绝对值最大)// ========== 步骤2:判断当前列是否全为0(该未知数无法消元,跳过) ==========if (fabs(a[t][c]) < eps) continue;// ========== 步骤3:将主元行交换到当前处理行(第r行) ==========for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);// ========== 步骤4:将主元行的当前列系数化为1(行变换:当前行 ÷ 主元) ==========// 从后往前遍历:避免先修改a[r][c]导致后续计算错误for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];// ========== 步骤5:消去当前列下方所有行的系数(化为0) ==========for (int i = r + 1; i < n; i ++ )// 若当前行的该列系数非0,才需要消元if (fabs(a[i][c]) > eps)// 从后往前消元:避免先修改a[i][c]导致后续计算错误for (int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ; // 当前行处理完成,下一行待处理}// ========== 步骤6:判断解的情况 ==========// 若处理的行数 < 未知数个数(存在自由变量)if (r < n){// 检查是否存在 0 = 非0 的矛盾方程(无解)for (int i = r; i < n; i ++ )// 若常数项非0,系数全0 → 0 = b_i ≠ 0,无解if (fabs(a[i][n]) > eps)return 2;// 无矛盾方程 → 有无穷多解return 1;}// ========== 步骤7:回代求解(将上三角矩阵化为对角矩阵,得到唯一解) ==========// 从最后一行往前回代,消去上三角的非对角元素for (int i = n - 1; i >= 0; i -- )for (int j = i + 1; j < n; j ++ )// a[i][n] = a[i][n] - 已求解的未知数 × 对应系数a[i][n] -= a[i][j] * a[j][n];return 0; // 有唯一解
}int main()
{// 输入未知数个数nscanf("%d", &n);// 输入增广矩阵:n行,每行n个系数 + 1个常数项(共n+1列)for (int i = 0; i < n; i ++ )for (int j = 0; j < n + 1; j ++ )scanf("%lf", &a[i][j]);// 调用高斯消元函数,获取解的情况int t = gauss();if (t == 2) puts("No solution");          // 无解else if (t == 1) puts("Infinite group solutions"); // 无穷多解else // 有唯一解,输出每个未知数的解(保留2位小数){for (int i = 0; i < n; i ++ )printf("%.2lf\n", a[i][n]);}return 0;
}
http://www.jsqmd.com/news/613787/

相关文章:

  • 超简单教程:Python 调用淘宝店铺商品 API(获取全店商品)
  • 硬盘出售 / 淘汰必看:3 种安全擦除方法,数据彻底无法恢复
  • 2026最全!大模型零基础保姆级教程,小白也能轻松入行,手把手带你玩转AI!
  • 上海抖音企业号运营怎么选?2026年热门公司实力解析,抖音运营公司/短视频代运营,抖音企业号运营服务商口碑推荐 - 品牌推荐师
  • 日志系统建设:从“查问题”到“预测问题”
  • 杰理之蓝牙歌词信息获取回调【篇】
  • 2026年卡地亚官方维修中心新址公布 服务热线更新 - 速递信息
  • 打造个人数字图书馆:Talebook私有化部署全攻略
  • 红人营销低效运作的归因框架:7个常见短板与针对性调整建议
  • 【pip包管理】【私仓配置】
  • WinCDEmu:开源虚拟光驱工具的技术架构与实践指南
  • 深度强化学习(DRL)及其在汽车自动驾驶中的应用 学习计划+实操指南
  • AI开发-python-langchain框架(--自定义Tool )卤
  • 24小时动态心电厂家推荐,精准监测守护心脏健康 - 品牌2026
  • 手写简易docker
  • 杰理之蓝牙空闲状态时间设置【篇】
  • CKKS 同态加密数学基础推导技
  • ctfileGet:突破网盘限速的本地解析方案
  • 写段代码教会你什么是HOOK技术?HOOK技术能干什么?肯
  • 失业期PHP程序员,你用什么态度对事,事就用什么结果对你。
  • 青海纯玩小团选型与实用指南:西北/青甘大环线旅行全攻略 - 深度智识库
  • 深度理解算法和数据结构:栈并非天生存在,而是数组的「思想封装」|4 道经典题从本质吃透栈与单调栈
  • 前端使用AI试水报告本
  • 2026年B2B工业制造企业GEO服务商排名深度解析:径硕科技(JINGdigital)与JINGEO为何稳居首选
  • Vim 中执行 :set mouse=a
  • 科研级时间序列解析:从 ARIMA 到 Mamba,深度学习与频域分析的全栈技术方案
  • 实测H3C s5500-52C-SI 交换机破解密码
  • 杰理之蓝牙名修改【篇】
  • 视觉生产力的觉醒:萤火AI如何让电商人从“工具”变回“人”
  • 微波管参数全解析:什么是增益、带宽?看懂这张图就够了!