SDOI2007线性方程组

题面

已知 n 元线性一次方程组。 其中: n < = 50 .系数是整数,绝对值<=100 , bi(方程右边)的值都是正整数且<300 根据输入的数据,编程输出方程组的解的情况。

输入

n a11 a12 … a1n b1

……..

an1 an2 … ann bn

输出 如果方程组无实数解输出-1 ;    如果有无穷多实数解,输出 0 ;    如果有唯一解,则输出解(小数点后保留两位小数,如果解是0,则不保留小数)

样例输入

3
2 -1 1 1
4 1 -1 5
1 1 1 0

样例输出

x1=1.00
x2=0
x3=-1.00

高斯消元板题 判断无解看代码 代码:

# include <iostream>
# include <cmath>
# include <cstdio>
using namespace std;
double a[110][110],ans[110];
int n;
void deal(int k){
	double p;int x = k;
	for(int i = k+1;i<=n;i++)if(abs(a[i][k])>abs(a[x][k]))x = i;
	if(x!=k)for(int i = k;i<=n+1;i++)swap(a[x][i],a[k][i]);
	for(int i = k+1;i<=n;i++){
		if(a[k][k]!=0){
			p = a[i][k]/a[k][k];
			for(int j = k;j<=n+1;j++){a[i][j]-=p*a[k][j];}
		}
	}
}
bool check(){
	int i,j;
	for(i = 1;i<=n;i++){
		for(j = 1;j<=n;j++)if(a[i][j]!=0)break;
		if(j>n){
			if(a[i][n+1]!=0){//所有系数都为0,但常数不为0无解
				cout<<-1<<endl;return false;
			}else{
				cout<<0<<endl;return false;//有无数解
			}
		}
	}
	return true;
}
void OutAns(){
	for(int i = n;i>0;i--){
		for(int j = n;j>i;j--)a[i][n+1]-=a[i][j]*ans[j];
		if(a[i][i]==0){
			if(a[i][n+1]==0)
				cout<<0<<endl;else cout<<-1<<endl;
			return;
		}
		ans[i] = a[i][n+1]/a[i][i];
	}
	for(int i = 1;i<=n;i++){
		if(ans[i]!=0)
			printf("x%d=%.2f\n",i,ans[i]);
		else printf("x%d=0\n",i);
	}
}
void guass(){
	for(int i = 1;i<=n;i++)deal(i);
	if(check())OutAns();
}
int main(){
	cin>>n;
	for(int i = 1;i<=n;i++)for(int j = 1;j<=n+1;j++)cin>>a[i][j];
	guass();
	return 0;
}