80pts求助
查看原帖
80pts求助
565378
Orange1015楼主2023/4/7 11:42

高斯约旦消元,80pts

#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
double a[MAXN][MAXN],ans[MAXN];
int n,flag;
void prt(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++)
		cout<<a[i][j]<<" ";
		cout<<endl;
	}
	return;
}
void gauss(){
	int r;
	for(int i=1;i<=n;i++){
		r=i;
		for(int j=i+1;j<=n;j++){
			if(fabs(a[j][i])>fabs(a[r][i])){
				r=j;
			}
		}
		if(i!=r){
			swap(a[i],a[r]);
		}
		if(a[i][i]==0){
			bool f=0;
			for(int j=i;j<=n;j++){
				if(a[i][j]!=0){
					f=1;
				}
			}
			if(!f){
				if(a[i][n+1]!=0) flag=-1;
				else flag=0;
				return;
			}
		}
		for(int j=1;j<=n;j++){
			if(j!=i){
				double tmp=a[j][i]/a[i][i];
				for(int k=i;k<=n+1;k++){
					a[j][k]=(a[j][k]-a[i][k]*tmp);
				}
			}
		}
		//prt();
	}
	for(int i=1;i<=n;i++){
		if(a[i][i]==0){
			if(a[i][n+1]==0) flag=0;
			else flag=-1;
			return;
		}
	}
	flag=1;
	return;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++){
			cin >> a[i][j];
		}
	}
	gauss();
	if(flag == 1){
		for(int i=1;i<=n;i++){
			ans[i]=a[i][n+1]/a[i][i];
			if(ans[i]==-0.0) ans[i]=0.00;
			printf("x%d=%.2lf\n",i,ans[i]);
		}
	}
	else{
		cout << flag;
	}
	return 0;
} 
2023/4/7 11:42
加载中...