高斯消元(模板)

傳送門:https://www.luogu.org/problem/P3389c++

其餘的博客會講的很清晰本蒟蒻就退下了數組

 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 }
相關文章
相關標籤/搜索