Skip to content

高斯消元 ​

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";
	}
}