[AcWing 883] 高斯消元解线性方程组
复杂度
总体复杂度
点击查看代码
#include<iostream>
#include<cmath>
using namespace std;
const int N = 110;
const double eps = 1e-9;
int n;
double a[N][N];
int gauss()
{
int c, r;
for (c = 0, r = 0; c < n; c ++) {
int t = r;
// 找绝对值最大的行
for (int i = r; i < n; i ++) {
if (fabs(a[t][c]) < fabs(a[i][c]))
t = i;
}
if (fabs(a[t][c]) < eps) continue;
// 将绝对值最大的行替换到最上面
for (int i = c; i <= n; i ++) swap(a[t][i], a[r][i]);
// 将当前行的首位变成 1
for (int i = n; i >= c; i --) a[r][i] /= a[r][c];
// 用当前行将下面所有的列消为 0
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 2; // 无解
return 1; // 无穷多组解
}
// 从下往上倒推出解
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 == 0) {
for (int i = 0; i < n; i ++) {
// 去掉 -0.00 的情况
if (fabs(a[i][n]) < eps) a[i][n] = 0;
printf("%.2f\n", a[i][n]);
}
}
else if (t == 1) puts("Infinite group solutions");
else puts("No solution");
return 0;
}
- 行列式的初等行列变换
① 把某一行乘以一个非零的常数;
② 交换某两行;
③ 把某一行的若干倍加到另一行; - 判断解的个数
① 完美阶梯型:唯一解;
② 出现 0 = 非 0 :无解;
③ 出现 0 = 0:无穷多组解; - 高斯消元
枚举每一列 c (已经换过的行不动,只对未换过的行执行以下操作)
① 找到绝对值最大的一行;(c 列中绝对值最大的)
② 将该行换到最上面;(未换过的行中的最上面,换过的行的下面)
③ 将该行的第一个数变为 1;
④ 将下面所有行的第 c 列清成 0;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!