关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

n元一次线性方程组模板

发布时间:2023-06-27 16:00:32

题目描述


给定 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. #include2. 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. }

/template/Home/leiyu/PC/Static