P3389 【模板】高斯消元法
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 }