高斯消元模板

详解参照其他博客,简单模板如下

 1 /*处理出的倒三角是这个形状的
 2 x1 x2 x3=..
 3    x2 x3=..
 4       x3=..
 5 */
 6 #include<bits/stdc++.h>
 7 #define N 205
 8 using namespace std;
 9 const double eps=1e-8;
10 int n;
11 double a[N][N],del;
12 bool gauss(){
13     for(int i=1;i<=n;i++){//处理第i列,行也处理到i 
14         int k=i;//i:当前处理的列 和 行 
15         for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[k][i]))k=j;//找到i列最大的系数在的行 
16         if(fabs(del=a[k][i])<eps)return 0;//最大数的行都为0,无解或多解     del:i列最大系数 
17         for(int j=i;j<=n+1;j++)swap(a[i][j],a[k][j]);//交换两行,将大的换到上面去,底下开始消元 
18         for(int j=i;j<=n+1;j++)a[i][j]/=del;//最大系数化为 1 
19         for(k=1;k<=n;k++)if(k!=i){
20             del=a[k][i];
21             for(int j=i;j<=n+1;j++)a[k][j]-=a[i][j]*del;//也可看做a[k][j]=a[k][j]/del-a[i][j]
22             //即把a[k][i]也系数化为1,再减去i行,显然k的第i列变成0了,即达到了消元的目的 
23         }
24     }
25     return 1;
26 }
27 int main(){
28     scanf("%d",&n);
29     for(int i=1;i<=n;i++)
30     for(int j=1;j<=n+1;j++)
31         scanf("%lf",&a[i][j]);
32     bool flag=gauss();
33     if(!flag) puts("No Solution");
34     else 
35     {
36         for(int i=1;i<=n;i++)
37             printf("%.2lf\n",a[i][n+1]);
38     }
39     return 0;
40 }

 

posted @ 2018-08-12 19:14  蛙蛙1551  阅读(151)  评论(0编辑  收藏  举报