#include 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; }