Files
python/TangDou/AcWing_TiGao/T5/GaoSiXiaoYuan/207.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

53 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
const double eps = 1e-8; // 小数的精度值
int n;
double a[N][N], b[N][N];
int gauss() { // 高斯消元,答案存于a[i][n]中,0 <= i < n
int r = 1; // 先按行后按列进行计算,当前行是第1行
for (int c = 1; c <= n; c++) { // 枚举每一列
int t = r; // 防破坏r,复制出t
for (int i = r; i <= n; i++) // 当前行需要找它的后续行
if (abs(a[i][c]) > abs(a[t][c])) t = i; // t的任务是找出c列中系数最大值是哪一行
if (abs(a[t][c]) < eps) continue; // 如果c列绝对值最大的系数是0, 那么处理下一列
for (int i = c; i <= n + 1; i++) swap(a[t][i], a[r][i]); // 将绝对值最大的行与当前行交换
for (int i = n + 1; i >= c; i--) a[r][i] /= a[r][c]; // a[r][c]:行首系数,将当前行的行首通过除法变为1,倒序
for (int i = r + 1; i <= n; i++) // 用当前行r的c列,通过减法将后续行c列消成0
for (int j = n + 1; j >= c; j--) // 倒序,需要保留行首,逻辑和上面是一样的,行首值是变更系数,如果正序就把系数变成1了,后面就不对了
a[i][j] -= a[r][j] * a[i][c]; // a[i][c]:需要变化的乘法系数,减法:对位相消
r++; // 下一行
}
if (r <= n) { // 如果没有成功执行完所有行,意味着中间存在continue,也就是某一列的系数都是0
for (int i = r; i <= n; i++)
if (abs(a[i][n + 1]) > eps) return 0; // 系数是0,但结果不是0,无解
return 2; // 系数是0,结果也是0,x取啥都对,有无穷多组解
}
// 代回求每个变量值
for (int i = n - 1; i; i--) // 行,倒序
for (int j = i + 1; j <= n; j++) // 列,倒三角,右上角应该都是0,对角线全是1
a[i][n + 1] -= a[i][j] * a[j][n + 1]; // 系数消为0
return 1; // 有唯一解
}
int main() {
cin >> n;
for (int i = 0; i <= n; i++) // n+1行,下标从0开始
for (int j = 1; j <= n; j++) // n列
cin >> b[i][j];
// 转换为线性方程组
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
a[i][j] += 2 * (b[i][j] - b[0][j]);
a[i][n + 1] += b[i][j] * b[i][j] - b[0][j] * b[0][j];
}
// Gauss消元
gauss();
// 输出答案
for (int i = 1; i <= n; i++) printf("%.3lf ", a[i][n + 1]);
return 0;
}