90pts求助-判断无解和无穷多解出错
查看原帖
90pts求助-判断无解和无穷多解出错
537998
lpx2024楼主2024/1/19 08:24

无解和无穷多解记flag最后集中处理了

记录:https://www.luogu.com.cn/record/141558770

代码

#include<bits/stdc++.h>
#include<cmath>
#define eps 1e-8
using namespace std;
double a[110][110],b[110];
int main(){
	int n,flag=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lf",&a[i][j]);
		}
		scanf("%lf",&b[i]);
	}
	for(int i=1;i<=n;i++){
		//找一个不为0的值 
		int fl2=0;
		for(int j=i;j<=n;j++){
			if(fabs(a[j][i])>eps){
				if(i!=j){
					for(int k=i;k<=n;k++) swap(a[j][k],a[i][k]);
					swap(b[i],b[j]);
				}
				break;
			}
			if(j==n) flag=1,fl2=1;
		}
		if(fl2){
			fl2=0;
			continue; 
		}
		//把a[i][i]的值设为1 
		b[i]/=a[i][i];
		for(int j=n;j>=i;j--) a[i][j]/=a[i][i];
		//进行消元 
		for(int j=i+1;j<=n;j++){
			b[j]-=b[i]*a[j][i];
			for(int k=n;k>=i;k--){
				a[j][k]-=a[j][i]*a[i][k];
			}
		}//形成三角矩阵 
	}
	if(flag){
		for(int i=n;i;i--){
			for(int j=1;j<=n;j++){
				if(fabs(a[i][j])>eps){
					puts("0");
					return 0;
				}
			}
			if(fabs(b[i])>eps){
				puts("-1");
				return 0;
			}
		}
		return 0;
	}
	for(int i=n;i;i--){
		for(int j=i-1;j;j--){
			b[j]-=a[j][i]*b[i];
			a[j][i]-=a[j][i];
		}
	}
	for(int i=1;i<=n;i++){
		printf("x%d=%.2lf\n",i,b[i]);
	}
	return 0;
}
2024/1/19 08:24
加载中...