2 条题解
-
0
G23线性方程组高斯消元法
G23线性方程组高斯消元法#include <bits/stdc++.h> using namespace std; const double eps = 1e-8; int n; double a[110][110], x[110]; void gauss() { int r = 1; // r统计主元的个数+1 for (int c = 1; c <= n; c++) // 让第r行x[c]的系数不为零,r+1~n行x[c]的系数为0 { for (int i = r + 1; i <= n; i++) { while (fabs(a[i][c]) > eps) // 此处改为if也对 { double bs = a[r][c] / a[i][c]; for (int j = 1; j <= n + 1; j++) { a[r][j] = a[r][j] - a[i][j] * bs; } swap(a[r], a[i]); // 交换两行 } } if (fabs(a[r][c]) > eps) r++; // 找到主元,r自增 } // 检查无解情况:第r行及以下存在非零常数项 for (int i = r; i <= n; i++) { if (fabs(a[i][n + 1]) > eps) { printf("-1\n"); return; } } // 检查无穷多解情况:主元个数小于n if (r <= n) { printf("0\n"); return; } // 回代求解 for (int i = n; i >= 1; i--) { for (int j = i + 1; j <= n; j++) { a[i][n + 1] -= x[j] * a[i][j]; } x[i] = a[i][n + 1] / a[i][i]; if (fabs(x[i]) < eps) x[i] = fabs(x[i]); // 处理精度问题 } // 输出解 for (int i = 1; i <= n; i++) { printf("x%d=%.2lf\n", i, x[i]); } } int main() { scanf("%d", &n); // 读入增广矩阵 for (int i = 1; i <= n; i++) { for (int j = n + 1; j >= 1; j--) { scanf("%lf", &a[i][j]); } } gauss(); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const double eps=1e-8; int n; double a[110][110],x[110]; void gauss() { int r=1;//r统计主元的个数+1 for(int c=1;c<=n;c++)// 让第r行x[c]的系数不为零,r+1~n行x[c]的系数为0 { for(int i=r+1;i<=n;i++) { while( fabs(a[i][c])>eps )//此处改为if也对 { double bs=a[r][c]/a[i][c]; for(int j=1;j<=n+1;j++)a[r][j]=a[r][j]-a[i][j]*bs; swap(a[r],a[i]); } } if(fabs(a[r][c])>eps) r++; } //此时找到了 r-1 个主元 for(int i=r;i<=n;i++)if(fabs(a[i][n+1])>eps) {printf("-1\n");return ;} if(r<=n) {printf("0\n");return ;} for(int i=n;i>=1;i--) { for(int j=i+1;j<=n;j++)a[i][n+1]-=x[j]*a[i][j]; x[i]=a[i][n+1]/a[i][i]; if(fabs(x[i])<eps)x[i]=fabs(x[i]); } for(int i=1;i<=n;i++)printf("x%d=%.2lf\n",i,x[i]); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]); gauss(); return 0; }
- 1
信息
- ID
- 521
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 183
- 已通过
- 32
- 上传者