高斯消元(模板)

传送门:https://www.luogu.org/problem/P3389

其他的博客会讲的很清晰本蒟蒻就退下了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 double b[109][109];
 5 const double esp=1e-18;
 6 double ans[109];
 7 int main()
 8 {
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++)
11     {
12         for(int j=1;j<=n+1;j++)
13         {
14             scanf("%lf",&b[i][j]);
15         }
16     }
17     for(int i=1;i<=n;i++)
18     {
19         int pos=i;
20         for(int j=i;j<=n;j++)
21         {
22             if(fabs(b[pos][i])-fabs(b[j][i])<esp)
23             {
24                 pos=j;
25             }
26         }
27         if(fabs(b[pos][i])<esp)
28         {
29             puts("No Solution");
30             return 0;
31         }
32         double div=b[i][i];
33         for(int j=i;j<=n+1;j++)
34         {
35             b[i][j]/=div;//将当前系数化一 
36         }
37         for(int j=i+1;j<=n;j++)
38         {
39             div=b[j][i];
40             for(int k=i;k<=n+1;k++)
41             {
42                 b[j][k]-=b[i][k]*div;
43             }
44         }
45     }
46     /*
47     这个时候的b数组是这个样子的
48     1 x x x | x
49     0 1 x x | x
50     0 0 1 x | x
51     0 0 0 1 | x 
52     */
53     ans[n]=b[n][n+1];//所以只能先确定最后一个解
54     for(int i=n-1;i>=1;i--)
55     {
56         ans[i]=b[i][n+1];    
57         for(int j=i+1;j<=n;j++)
58         {
59             ans[i]-=(b[i][j]*ans[j]);//减去前面的解和它相应的系数 
60         }
61     }
62     for(int i=1;i<=n;i++)
63     {
64         printf("%.2lf\n",ans[i]);
65     }
66 }

 

posted @ 2019-10-25 08:56  nono_ttaa  阅读(160)  评论(0编辑  收藏  举报