洛谷P2455 [SDOI2006]线性方程组

题目描述

已知n元线性一次方程组。

洛谷P2455 [SDOI2006]线性方程组_第1张图片

其中:n<=50, 系数是[b][color=red]整数<=100(有负数),bi的值都是整数且<300(有负数)(特别感谢U14968 mmqqdd提出题目描述的说明)(redbag:是mqd自己要我写的= =)[/color][/b].

编程任务:

根据输入的数据,编程输出方程组的解的情况。

输入输出格式

输入格式:

第一行:未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。

洛谷P2455 [SDOI2006]线性方程组_第2张图片

输出格式:

如果方程组无实数解输出-1;

如果有无穷多实数解,输出0;

如果有唯一解,则输出解(小数点后保留两位小数)。

输入输出样例

输入样例#1: 
3
2 -1 1 1
4 1 -1 5
1 1 1 0
输出样例#1: 
x1=1.00
x2=0
x3=-1.00





高斯消元。。。

 无解的情况(-1): 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0)

无穷解的情况(0): 在 var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行

一定要注意先判-1,再判0,卡了n次。。。。。

附代码:

#include
#include
#include
#include
#define MAXN 110
#define eps 1e-8
using namespace std;
int n;
double a[MAXN][MAXN];
bool flag1=false,flag2=false;
inline int read(){
	int date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n+1;j++)
	a[i][j]=read();
	for(int i=1;i<=n;i++){
		int k=i;
		for(int j=i+1;j<=n;j++)if(fabs(a[j][i])-fabs(a[k][i])>eps)k=j;
		for(int j=1;j<=n+1;j++)swap(a[i][j],a[k][j]);
		if(fabs(a[i][i])n+1)flag2=true;
		else if(j==n+1)flag1=true;
	}
	if(flag1){
		printf("-1\n");
		return 0;
	}
	if(flag2){
		printf("0\n");
		return 0;
	}
	for(int i=1;i<=n;i++)printf("x%d=%.2lf\n",i,a[i][n+1]);
	return 0;
}

你可能感兴趣的:(数论,高斯消元)