【luogu3389】【模板】高斯消元法 [高斯消元]

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 }

 

posted @ 2019-03-31 17:15  委屈的咸鱼鱼鱼鱼  阅读(123)  评论(0)    收藏  举报