【问题描述】
已知 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
#include<bits/stdc++.h> #define ll long long #define DB double #define eps 1e-8 using namespace std; inline int read() { int x=0,w=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*w; } const int N=120; int n; DB a[N][N]; //-1 无解 0 0 0 9 //0 多解 右上三角矩阵中不完全为1 //1 唯一解 void debug() { for(int i=1;i<=n;++i) { for(int j=1;j<=n+1;++j) printf("%.2lf ",a[i][j]); printf(" "); } cout<<"_________________"<<endl; } int gaosi() { for(int i=1;i<=n;++i) { int nw=i; for(int j=i+1;j<=n;++j) if(fabs(a[nw][i])<fabs(a[j][i])) nw=j; swap(a[nw],a[i]); if(fabs(a[i][i])<eps) continue; DB h=a[i][i]; for(int j=i;j<=n+1;++j) a[i][j]/=h; for(int j=1;j<=n;++j) if(j!=i) { DB zz=a[j][i]; for(int k=1;k<=n+1;++k) a[j][k]-=zz*a[i][k]; } } //判断解 int opt1=0,opt2=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) opt1=1;//多解 else if(j==n+1)opt2=1;//无解 } if(opt2) return -1; if(opt1) return 0; return 1; } int main() { freopen("gaess.in","r",stdin); freopen("gaess.out","w",stdout); n=read(); for(int i=1;i<=n;++i) for(int j=1;j<=n+1;++j) a[i][j]=(DB)read(); int fg=gaosi(); // debug(); if(fg==-1) cout<<"-1"; else if(fg==0) cout<<"0"; else{ for(int i=1;i<=n;++i) if(a[i][n+1]==0) printf("x%d=%d ",i,0); else printf("x%d=%.2lf ",i,a[i][n+1]); } return 0; }