直接上公式(代码)
#include <bits/stdc++.h>
using namespace std;
int a[10][11];
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 maxi = 1;
for (int j = i + 1; j <= n; j++) {
if (abs(a[j][1]) > abs(a[maxi][1])) {
maxi = j;
}
}
// 将最大的一行放到前面
for (int j = 1; j <= n + 1; j++) {
swap(a[i][j], a[maxi][j]);
}
// 判断如果对角线的主系数等于0,说明没有唯一解(因为我少了一个行)
if (abs(a[i][i] < eps)) {
puts("No Solution");
return 0;
}
// 把这一行的主系数换乘1
for (int j = n + 1; j >= 1; j--) { // 要从n + 1到1
a[i][j] = a[i][j] / a[i][i];
}
// 消去主系数所在列的其他系数
for (int j = 1; j <= n; j++) { // 遍历上到下
if (j != i) {
double temp = a[j][i] / a[i][i];
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]);
}
}
练习:
poj 1684
hdu 5755
洛谷p3389 4387 2447 4035 5516 4111 4457
poj 2947 1487 2065 1166 2965