高斯消元第二个点挂了?
查看原帖
高斯消元第二个点挂了?
113181
滑蒻稽楼主2021/4/8 18:17

提示

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;
}
2021/4/8 18:17
加载中...