lpx2024 @ 2024-01-19 08:24:34
无解和无穷多解记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;
}