题目描述
给定 n 个形如a1x1+a2x2+a3x3+⋯+anxn=b 的线性方程组,请你求出 x1,x2,⋯,xn。
输入描述
第 1行为一个整数 n。
接下来的 n 行每行包含一个 n+1 个整数 a1,a2,⋯,an,b,表示方程对应的系数和值。
1≤n≤100,−104≤∣ai∣,∣b∣≤104,保证对于任意的 i,j,ai,aj 都互质。
输出描述
输出 n 行,每行包含一个数,分别表示x1∼xn。
若不存在唯一解,则仅需输出一行 −1。
答案保留 2 位小数。
样例输入
样例输出
1. #include<bits/stdc++.h> 2. using namespace std; 3. double a[105][105]; //存方程组的矩阵 4. double eps = 1e-7; 5. int main(){ 6. int n; 7. scanf("%d",&n); 8. for(int i=1;i<=n;++i) 9. for(int j=1;j<=n+1;++j) 10. scanf("%lf",&a[i][j]); //读方程组,存入矩阵 11. for(int i=1;i<=n;++i){ //枚举列 12. int max=i; 13. for(int j=i+1;j<=n;++j) //选出该列最大系数 14. if(fabs(a[j][i])>fabs(a[max][i])) 15. max=j; 16. for(int j=1;j<=n+1;++j) 17. swap(a[i][j],a[max][j]); //把最大系数所在的行移到前面 18. if(fabs(a[i][i]) < eps){ //对角线上的主元系数等于0,说明没有唯一解 19. puts("-1"); 20. return 0; 21. } 22. for(int j=n+1;j>=1;j--) //把这一行的主元系数变为1 23. a[i][j]= a[i][j]/a[i][i]; //除法产生精度问题 24. for(int j=1;j<=n;++j){ //消去主元所在列的其他行的主元 25. if(j!=i) { 26. double temp=a[j][i]/a[i][i]; 27. for(int k=1;k<=n+1;++k) 28. a[j][k] -= a[i][k]*temp; 29. } 30. } 31. } 32. for(int i=1;i<=n;++i) 33. printf("%.2f\n",a[i][n+1]); //最后得到简化阶梯矩阵 34. return 0; 35. }