【luogu3389】【模板】高斯消元法 [高斯消元]
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define rg register 4 const int N=100+5; 5 const double eps=1e-20; 6 int n; 7 double a[N][N],ans[N]; 8 9 template <class t>void rd(t &x) 10 { 11 x=0;int w=0;char ch=0; 12 while(!isdigit(ch)) w|=ch=='-',ch=getchar(); 13 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 14 x=w?-x:x; 15 } 16 //fabs求浮点数x的绝对值 17 int main() 18 { 19 rd(n); 20 for(rg int i=1;i<=n;++i) 21 for(rg int j=1;j<=n+1;++j) scanf("%lf",&a[i][j]); 22 for(rg int i=1;i<=n;++i)//枚举定量 23 { 24 int now=i; 25 for(rg int j=i+1;j<=n;++j) 26 if(fabs(a[now][i])<fabs(a[j][i])) now=j;//找最大的第i主元 27 if(fabs(a[now][i])<eps) {printf("No Solution");exit(0);} 28 if(now!=i) swap(a[now],a[i]); 29 // for(int j=1;j<=n+1;++j) swap(a[now][j],a[i][j]);//交换 30 double div=a[i][i]; 31 for(rg int j=i;j<=n+1;++j) a[i][j]/=div;//将后面的序数都除div 32 for(rg int j=i+1;j<=n;++j) 33 { 34 div=a[j][i]; 35 for(rg int k=i;k<=n+1;++k) a[j][k]-=a[i][k]*div; 36 } 37 } 38 ans[n]=a[n][n+1]; 39 for(rg int i=n-1;i>=1;--i) 40 { 41 ans[i]=a[i][n+1]; 42 for(rg int j=i+1;j<=n;++j) ans[i]-=a[i][j]*ans[j]; 43 } 44 for(rg int i=1;i<=n;++i) printf("%.2f\n",ans[i]); 45 return 0; 46 }