721. [SDOI2007] 线性方程组
★★ 输入文件:gaess.in
输出文件:gaess.out
简单对比
时间限制:1 s 内存限制:128 MB
- 【问题描述】
- 已知 n 元线性一次方程组。
a1,1x1+a1,2x2+…+a1,nxn=b1
a2,1x1+a2,2x2+…+a2,nxn=b2
………………
an,1x1+an,2x2+…+an,nxn=bn
其中: n<=50.系数是整数,绝对值<=100 , bi的值都是正整数且<300。
编程任务:
根据输入的数据,编程输出方程组的解的情况。
【输入】(gaess.in)
第一行,未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。
n
a1,1a1,2…a1,nb1
a2,1a2,2…a2,nb2
…………
an,1an,2…an,nbn
【输出】(gaess.out)
如果方程组无实数解输出−1 ;
如果有无穷多实数解,输出 0 ;
如果有唯一解,则输出解(小数点后保留两位小数,如果解是0,则不保留小数)
【样例输入】
3
2 -1 1 1
4 1 -1 5
1 1 1 0
【样例输出】
x1=1.00
x2=0
x3=-1.00
2017/03/22新加3组数据 by rapiz
/*高斯消元求解线性方程组*/ #include<cstdio> #include<algorithm> #include<iostream> #include<cmath> using namespace std; #define N 100 #define eps (1e-8) int n;double a[N][N]; int main(){ freopen("gaess.in", "r", stdin); freopen("gaess.out", "w", stdout); //freopen("cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++){ int p=i; for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[p][i]))p=j; for(int j=1;j<=n+1;j++)swap(a[p][j],a[i][j]); if(fabs(a[i][i])<eps)continue; double tmp=a[i][i]; for(int j=1;j<=n+1;j++)a[i][j]/=tmp; for(int j=1;j<=n;j++) if(i!=j){ double tmp=a[j][i]; for(int k=1;k<=n+1;k++)a[j][k]-=a[i][k]*tmp; } } int imp=0,ult=0; for(int i=1;i<=n;i++){ int j=1; while(fabs(a[i][j])<eps&&j<=n+1)j++; if(j>n+1)ult=1; else if(j==n+1)imp=1; } if(imp){printf("-1");return 0;} if(ult){printf("0");return 0;} for(int i=1;i<=n;i++){ if(fabs(a[i][n+1])<eps)printf("x%d=0 ",i); else printf("x%d=%.2lf ",i,a[i][n+1]); } }