rt
第8个点没有过
说一下大致的思路:
ge()是高斯消元的函数
就是找到第一个系数不是0的式子,与第一个式子交换,成为消去后面式子的式子A
然后将A去消其他的式子
由于我不知道在这个函数内应该如何判断无解
我后面又写了一个用改判断无解的
如果一个式子的系数全部为0,那么无解
因为这里要求化简,这里还有一个化简的式子
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 110;
const double EPS = 1e-8;
typedef double M[N][N];
M m;
int n;
//选取式A(i),用它来消去剩下的式子
void ge()
{
for (int i = 1; i <= n; ++ i)
{
for (int j = i; j <= n; ++ j)
{
if (fabs(m[j][i]) <= EPS) continue;
for (int k = 1; k <= n + 1; ++ k) swap(m[i][k], m[j][k]);
}
for (int j = 1; j <= n; ++ j)
{
//j -> 即将消去的式子
if (i == j) continue;
double t = m[j][i] / m[i][i];
for (int k = 1; k <= n + 1; ++ k) m[j][k] -= t * m[i][k];
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= n + 1; ++ j)
scanf("%lf", &m[i][j]);
ge();
// for (int i = 1; i <= n; ++ i)
// {
// for (int j = 1; j <= n + 1; ++ j)
// printf("%.2lf ", m[i][j]);
// puts("");
// }
int cnt;
for (int i = 1; i <= n; ++ i)
{
cnt = 0;
for (int j = 1; j <= n; ++ j)
{
if (fabs(m[i][j]) <= EPS) ++ cnt;
else m[i][n + 1] /= m[i][j];
}
if (cnt == n)
{
printf("No Solution\n");
return 0;
}
}
for (int i = 1; i <= n; ++ i)
printf("%.2lf\n", m[i][n + 1]);
return 0;
}
求大佬可以指点一下