题目描述
给定一个线性方程组,对其求解
输入格式
第一行,一个正整数 n
第二至 n+1 行,每行 n+1个整数,为 a1,a2⋯an 和 b,代表一组方程。
输出格式
共 n 行,每行一个数,第 i 行为 xi (保留 2 位小数)
如果不存在唯一解,在第一行输出 No Solution
.
输入输出样例
输入 #1复制
3 1 3 4 5 1 4 7 3 9 3 2 2
输出 #1复制
-0.97 5.18 -2.39
#include<bits/stdc++.h>
using namespace std;
double a[105][105];
double eps = 1e-7;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n + 1; ++j) {
cin >> a[i][j];
}
}
for (int i = 1; i <= n; i++) {
int max = i;
for (int j = i + 1; j <= n; ++j) {
if (fabs(a[j][j]) > fabs(a[max][i])) max = j;
}
for (int j = 1; j <= n + 1; ++j) swap(a[i][j], a[max][j]);
if (fabs(a[i][i]) < eps) {
puts("No Solution");
return 0;
}
for (int j = n + 1; j >= 1; j--) {
a[i][j] = a[i][j] / a[i][i];//将这一行的对角化为1
}
for (int j = 1; j <= n; ++j) {
if (j != i) { //自己不可能消除自己 不然第i行全为0了
double temp = a[j][i] / a[i][i];//i行的对角线下的列消成0
for (int k = 1; k <= n + 1; ++k)
a[j][k] -= a[i][k] * temp;
}
}
}
for (int i = 1; i <= n; i++) printf("%.2f\n", a[i][n + 1]);
return 0;
}