其他分享
首页 > 其他分享> > [洛谷P3389][模板]高斯消元法

[洛谷P3389][模板]高斯消元法

作者:互联网

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int n;
 8 double a[101][102];
 9 
10 void solve()
11 {
12     int g;
13     for(int i=1;i<=n;i++)//消元循环,i用于检索对角线上各个点的行列
14     {
15         if(!a[i][i])
16         {
17             int r=i; //记录当前所在的行
18             for(r=i+1;r<=n;r++) //寻找当前列上不为零的一行
19                 if(a[r][i])
20                 {
21                     break;
22                 }
23             for(int j=1;j<=n+1;j++)
24                 swap(a[r][j],a[i][j]); //换行
25         }
26         /* 接下来利用高斯消元法求解
27         实际左下的三角形对整个式子的结果无影响,
28         只需根据它们求上下的比例关系 */
29         for(int k=i+1;k<=n;k++) //k用于记录需消元的行 
30             for(int j=n+1;j>=i;j--) //j用于记录该行每个需要变化的,用于计算结果的系数
31                 {
32                     a[k][j] -= (a[k][i]/a[i][i])*a[i][j];
33                 }
34                 /*
35                    这里是求出了这一行需要消去的系数和它上面对应的数的
36                    关系,然后按照这个关系对无需消去的数求差,这里一定
37                    是按照三角形消的,因为最外层循环的i在改变,从而就改
38                    变了开始这一“消元”循环的位置,注意用双精
39                 */
40     }
41 
42     for(int i=n;i>=1;i--) //求解循环,从最后一个解倒推
43     {
44         if(!a[i][i])
45         {
46             cout<<"No Solution";
47             return;
48         }
49         for(int j=i+1;j<=n;j++)
50             a[i][n+1] -= a[j][n+1]*a[i][j]; //将解存到等式右边
51         a[i][n+1]/=a[i][i]; //最后的值除以当前的未知数的系数
52     }
53 
54     for(g=1;g<=n;g++)
55         printf("%.2lf\n",a[g][n+1]);
56 }
57 
58 int main()
59 {
60     int pl;
61     ios::sync_with_stdio(false);
62     cin>>n;
63     for(int i=1;i<=n;i++)
64         for(int j=1;j<=n+1;j++)
65             cin>>a[i][j];
66     solve();
67 
68     return 0;
69 }
70 
71 /* 第一个数据devc++和洛谷都能过,vscode过不了,不知道为什么 */

标签:消去,洛谷,int,循环,solve,高斯消,include,P3389
来源: https://www.cnblogs.com/Foggy-Forest/p/12203194.html