高斯消元

高斯消元最朴素的板子......

求解线性方程组。

先转换为增广矩阵。

从上到下一行一行消元呗。

每次挑个首列最大的行消。

求出来可能不是整数,要用double。

具体看代码。

最后求出来xn之后回带求出x1、x2......xn-1。

给个洛谷的模板题链接:传送门

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n;
 7 double c[105][105];
 8 double x[105];
 9 double eps=1e-7;
10 
11 double v(double rx)
12 {
13     return rx>0?rx:-rx;
14 }
15 
16 int main()
17 {
18     scanf("%d",&n);
19     for(int i=1;i<=n;i++)
20         for(int j=1;j<=n+1;j++)
21             scanf("%lf",&c[i][j]);
22     for(int i=1;i<=n;i++)
23     {
24         int p=i;
25         for(int j=i+1;j<=n;j++)
26             if(v(c[j][i])>v(c[p][i]))p=j;
27         if(v(c[p][i])<eps)
28         {
29             printf("No Solution");
30             return 0;
31         }
32         if(i!=p)
33         {
34             for(int j=i;j<=n+1;j++)
35                 swap(c[i][j],c[p][j]);
36         }
37         double div=c[i][i];
38         for(int j=i;j<=n+1;j++)
39             c[i][j]/=div;
40         for(int j=i+1;j<=n;j++)
41         {
42             div=c[j][i];
43             for(int k=i;k<=n+1;k++)
44                 c[j][k]-=c[i][k]*div;
45         }
46     }
47     x[n]=c[n][n+1];
48     for(int i=n-1;i;i--)
49     {
50         x[i]=c[i][n+1];
51         for(int j=i+1;j<=n;j++)
52             x[i]-=c[i][j]*x[j];
53     }
54     for(int i=1;i<=n;i++)
55         printf("%.2lf
",x[i]);
56     return 0;
57 }

这样就OK啦。

原文地址:https://www.cnblogs.com/cervusy/p/9588508.html