题目描述
已知n元线性一次方程组。
其中:n<=50, 系数是[b][color=red]整数<=100(有负数),bi的值都是整数且<300(有负数)(特别感谢U14968 mmqqdd提出题目描述的说明)(redbag:是mqd自己要我写的= =)[/color][/b].
编程任务:
根据输入的数据,编程输出方程组的解的情况。
输入输出格式
输入格式:第一行:未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。
输出格式:如果方程组无实数解输出-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<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#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])<eps)continue;
double num=a[i][i];
for(int j=1;j<=n+1;j++)a[i][j]/=num;
for(int j=1;j<=n;j++)
if(i!=j){
num=a[j][i];
for(int k=1;k<=n+1;k++)a[j][k]-=a[i][k]*num;
}
}
for(int i=1;i<=n;i++){
int j=1;
while(fabs(a[i][j])<eps&&j<=n+1)j++;
if(j>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;
}