高斯消元(yxc模板)

模板题链接

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 110;
 5 const double eps = 1e-6;
 6 int n;
 7 double a[N][N];
 8 
 9 int solve()
10 {
11     int c, r;
12     for (c = 0, r = 0; c < n; c ++ )
13     {
14         int t = r;
15         for (int i = r; i < n; i ++ )   // 找到绝对值最大的行
16             if (fabs(a[i][c]) > fabs(a[t][c]))
17                 t = i;
18 
19         if (fabs(a[t][c]) < eps) continue;
20 
21         for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);      // 将绝对值最大的行换到最顶端
22         for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];      // 将当前行的首位变成1
23         for (int i = r + 1; i < n; i ++ )       // 用当前行将下面所有的列消成0
24             if (fabs(a[i][c]) > eps)
25                 for (int j = n; j >= c; j -- )
26                     a[i][j] -= a[r][j] * a[i][c];
27 
28         r ++ ;
29     }
30 
31     if (r < n)
32     {
33         for (int i = r; i < n; i ++ )
34             if (fabs(a[i][n]) > eps)
35                 return 2; // 无解
36         return 1; // 有无穷多组解
37     }
38 
39     for (int i = n - 1; i >= 0; i -- )
40         for (int j = i + 1; j < n; j ++ )
41             a[i][n] -= a[i][j] * a[j][n];
42 
43     return 0; // 有唯一解
44 }
45 
46 signed main(){
47     cin >> n;
48     for(int i = 0; i < n; ++i){
49         for(int j = 0; j < n + 1;++j){
50             cin >> a[i][j];
51         }
52     }
53     
54     int ans = solve();
55     if(ans == 0){
56         for(int i = 0; i < n; ++i) printf("%.2f\n", a[i][n]);
57     }else ...
58     
59     return 0;
60 }

 

posted @ 2022-04-04 11:18  std&ice  阅读(71)  评论(0编辑  收藏  举报