数值分析/计算方法,欢迎交流
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
int Read() {
int x = 0;
char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9')
x = x * 10 + (c ^ 48), c = getchar();
return x;
}
const double eps = 1e-7;
inline double Abs(const double &x) {
return x < 0 ? -x : x;
}
inline int Comp(const double &x,const double &y) {
if (Abs(x-y) < eps)
return 0;
return Abs(x) > Abs(y) ? 1 : -1;
}
const int MAXN = 100;
int N;
double A[MAXN + 5][MAXN + 5], Ans[MAXN + 5];
int main() {
N = Read();
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N + 1; j++)
scanf("%lf", &A[i][j]);
for(int i = 1; i <= N; i++) {
int pos = i;
for(int j = i + 1; j<= N; j++)
if(Comp(A[j][i], A[pos][i]) == 1)
pos = j;
// 这里找A[j][i]最大的是为了减少精度误差 与算法正确性无关
if(Comp(A[pos][i], 0) == 0) {
puts("No Solution");
return 0;
}
for(int j = 1; j <= N + 1; j++)
std::swap(A[pos][j], A[i][j]);
// 把A[j][i]最大的那行换上去
double tmp = A[i][i];
for(int j = i; j <= N + 1; j++)
A[i][j] /= tmp;
// 操作一
for(int j = i + 1; j <= N; j++){
tmp = A[j][i];
for(int k = i; k <= N + 1; k++)
A[j][k] -= A[i][k] * tmp;
}
// 操作二
}
for(int i = N; i >= 1; i--) {
Ans[i] = A[i][N + 1];
for(int j = N; j >= i + 1; j--)
Ans[i] -= Ans[j] * A[i][j];
}
for(int i = 1; i <= N; i++)
printf("%.2f\n", Ans[i]);
system("pause");
return 0;
}