洛谷 P3389 【模板】高斯消元法
以下这个好像叫高斯约旦消元法,没有回代
https://www.luogu.org/blog/37781/solution-p3389
#include<cstdio> #include<algorithm> #include<cmath> #define eps 1e-7 using namespace std; double a[110][110]; int n; void swap_line(int x,int y) { for(int i=1;i<=n+1;i++) swap(a[x][i],a[y][i]); } int dcmp(double x) { if(fabs(x)<eps) return 0; else return x>0?1:-1; } int main() { int i,j,k,nx;double nmax,t; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); for(i=1;i<=n;i++) { nmax=0; for(j=i;j<=n;j++) if(fabs(a[j][i])>fabs(nmax)) { nmax=a[j][i]; nx=j; } if(dcmp(nmax)==0) { puts("No Solution"); return 0; } swap_line(nx,i); for(j=1;j<=n+1;j++) a[i][j]/=nmax; for(j=1;j<=n;j++) if(j!=i) { t=a[j][i]/a[i][i];//可以直接t=a[j][i];因为a[i][i]一定是1 for(k=1;k<=n+1;k++) a[j][k]-=t*a[i][k]; } } for(i=1;i<=n;i++) printf("%.2lf\n",a[i][n+1]); return 0; }
还可以卡常
#include<cstdio> #include<algorithm> #include<cmath> #define eps 1e-7 using namespace std; double a[110][110]; int n; void swap_line(int x,int y) { for(int i=1;i<=n+1;i++) swap(a[x][i],a[y][i]); } int dcmp(double x) { if(fabs(x)<eps) return 0; else return x>0?1:-1; } int main() { int i,j,k,nx;double nmax; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); for(i=1;i<=n;i++) { nmax=0; for(j=i;j<=n;j++) if(fabs(a[j][i])>fabs(nmax)) { nmax=a[j][i]; nx=j; } if(dcmp(nmax)==0) { puts("No Solution"); return 0; } swap_line(nx,i); for(j=i+1;j<=n+1;j++) a[i][j]/=nmax; for(j=1;j<=n;j++) if(j!=i) for(k=i+1;k<=n+1;k++) a[j][k]-=a[j][i]*a[i][k]; } for(i=1;i<=n;i++) printf("%.2lf\n",a[i][n+1]); return 0; }