高斯消元
cpp
const double eps=1e-6;
double a[N][N];
int n;
int gauss(){
int r,c;
for(r=0,c=0;c<n;c++){
int t=r;
for(int i=r;i<n;i++){
if(fabs(a[i][c])>fabs(a[t][c]))t=i;
}//找出当前列的剩下行中的最大值所在行
if(fabs(a[t][c])<eps)continue;//如果最大值为0
for(int i=c;i<=n;i++)swap(a[r][i],a[t][i]);//让最大行上升到剩下行的第一行
for(int i=n;i>=c;i--)a[r][i]/=a[r][c];//第一个元素置1,倒序最后才更新a[r][i]
for(int i=r+1;i<n;i++){
if(fabs(a[i][c])>eps){
for(int j=n;j>=c;j--)a[i][j]-=a[i][c]*a[r][j];//倒序最后才更新a[i][c]
}
}
r++;
}
if(r<n){
for(int i=r;i<n;i++){
if(fabs(a[i][n])>eps)return 2;//无解
}
return 1;//无穷解
}
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
a[i][n]-=a[i][j]*a[j][n];//将剩余的数消去,只剩若干个1
}
}
return 0;
}
void solve(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++)cin>>a[i][j];
}
int t=gauss();
if(t!=0)cout<<"No Solution\n";
else{
for(int i=0;i<n;i++)cout<<setprecision(2)<<fixed<<a[i][n]<<"\n";
}
}