滑蒻稽 @ 2021-04-08 18:17:44
提示
Wrong Answer. wrong answer On line 1 column 5, read n, expected 5.
但我从头到尾都没输出过 n 这个字符啊
代码:
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=55;
int n;
struct mat {
int l,c;
double p[N][N];
double* operator [] (int i) {return p[i];}
}a;
void REF() {
for(int i=1;i<=n;i++) {
int flag=i;
for(int j=i;j<=n;j++) {
if(fabs(a[j][i])>fabs(a[flag][i])) flag=j;
}
for(int j=1;j<=n+1;j++) swap(a[flag][j],a[i][j]);
if(a[i][i]==0) continue;
for(int j=i+1;j<=n;j++) {
double t=a[j][i]/a[i][i];
for(int k=i;k<=n+1;k++) {
a[j][k]-=t*a[i][k];
}
}
}
}
void RREF() {
for(int i=n;i>=1;i--) {
if(a[i][i]==0) continue;
for(int j=n+1;j>=i;j--) a[i][j]/=a[i][i];
for(int j=i-1;j>=1;j--) {
double t=a[j][i];
for(int k=n+1;k>=1;k--) {
a[j][k]-=t*a[i][k];
}
}
}
bool no=false,many=false;
for(int i=1;i<=n;i++) {
int t=0;
for(int j=1;j<=n;j++) if(a[i][j]!=0) ++t;
if(t==0 && a[i][n+1]!=0) no=true;
if(t==0 && a[i][n+1]==0) many=true;
}
if(no) printf("-1");
else if(many) printf("0");
else for(int i=1;i<=n;i++) {if(!a[i][n+1]) a[i][n+1]=0.0;printf("x%d=%.2lf\n",i,a[i][n+1]);}
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n+1;j++) {
cin>>a[i][j];
}
}
REF();
RREF();
return 0;
}
by 滑蒻稽 @ 2021-04-08 19:00:48
@ethan_zhou 我在http://cogs.pro/交了,然后发现输出的不是 inf ,而是 -nan
by 滑蒻稽 @ 2021-04-08 20:41:19
@ethan_zhou 我写了一个数据生成器,然后发现是运算过程中 double
溢出变成 inf
了.然后 inf/inf
就是 nan
.然后符号位可能还是负的,就显示为 -nan
.真是醉了,早知道不用这么朴素的高斯消元了,用顺序消元多好.