YANGKAIHAN1 @ 2022-11-05 20:41:41
评测记录
#include<bits/stdc++.h>
using namespace std;
constexpr int N=105;
constexpr double eps=1e-18;
double a[N][N];
int n;
//高斯消元
//返回值1表示有唯一解,2表示有无数解,3表示无解
inline int gauss(void){
register int col=0,lin=0;//分别表示行和列
for(;col<n;col++,lin++){
register int mx=lin;
for(register int j=lin;j<n;j++)
if(fabs(a[j][col])>fabs(a[mx][col]))
mx=j;
if(fabs(a[mx][col])<=eps)
continue;
for(register int j=col;j<=n;j++)
swap(a[mx][j],a[lin][j]);
for(register int j=n;j>=col;j--)
a[lin][j]/=a[lin][col];
for(register int j=lin+1;j<n;j++)
if(fabs(a[j][col])>eps)
for(register int k=n;k>=col;k--)
a[j][k]-=a[lin][k]*a[j][col];
}
for(register int i=n-1;i>=0;i--)
for(register int j=i+1;j<n;j++)
a[i][n]-=a[i][j]*a[j][n];
//判定(出锅点)
if(lin<n){
for(register int i=lin;i<n;i++)
if(fabs(a[i][n])>eps)
return 3;
return 2;
}
return 1;
}
int main(void){
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=n;j++)
cin>>a[i][j];
register int state=gauss();
if(state==1)
for(register int i=0;i<n;i++)
cout<<"x"<<i+1<<"="<<fixed<<setprecision(2)<<a[i][n]<<endl;
else if(state==2)
cout<<0<<endl;
else
cout<<-1<<endl;
return 0;
}