洛谷P3389 【模板】高斯消元法

高斯—约当消元法:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 double a[105][105];
 4 double eps=1e-7;
 5 int main(){
 6     int n;scanf("%d",&n);
 7     for(int i=1;i<=n;i++) 
 8         for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]);
 9     for(int i=1;i<=n;i++){//枚举列 
10         int max=i;
11         for(int j=i+1;j<=n;j++)  
12             if(fabs(a[j][i])>fabs(a[max][i])) max=j;//选取该列最大系数,真实目的是选一个非0系数 
13         for(int j=1;j<=n+1;j++) swap(a[i][j],a[max][j]);//移到前面
14         if(fabs(a[i][i])<eps){//对角线上的主元系数为0,说明没有唯一解 
15             puts("No Solution");
16             return 0;
17         } 
18         for(int j=n+1;j>=1;j--) a[i][j]=a[i][j]/a[i][i];//把这一行的主元系数变为1
19         for(int j=1;j<=n;j++){//消去主元所在列的其他行的主元 
20              if(j!=i){
21                 double temp=a[j][i]/a[i][i];
22                 for(int k=1;k<=n+1;k++) a[j][k]-=a[i][k]*temp;
23             }
24         } 
25     }
26     for(int i=1;i<=n;i++) printf("%0.2lf\n",a[i][n+1]);
27     return 0;
28 }

 

posted @ 2022-04-30 08:29  YHXo  阅读(56)  评论(0)    收藏  举报