[洛谷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