邵哥日推题目使我产生学习高斯消元的想法QAQ
P3389 【模板】高斯消元法
- 学习的资料qwq
-
矩阵消元(高斯消元)
-
高斯消元法洛咕题解
- (小声bb我觉得第二个注释有锅qaq
2. 小东西quq
- fabs() 求浮点数的绝对值, 包含在<cmath>库中
- 二维数组居然可以直接 swap(plat[i], plat[flag]) 直接交换一整行?! 震惊!!
代码宝宝qaq
1 #include<cmath> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 const int sz = 111; 6 int n; 7 double eps = 1e-7; 8 double plat[sz][sz], ans[sz]; 9 int main() { 10 scanf("%d", &n); 11 for(int i = 1; i <= n; i++) 12 for(int j = 1; j <= n+1; j++) 13 scanf("%lf", &plat[i][j]); //将系数读入矩阵中 14 for(int i = 1; i <= n; i++) {//枚举每一列 15 int flag = i; 16 for(int j = i+1; j <= n; j++) { 17 //每一行,以前有当过主元的那一行不考虑, 所以从i+1行开始, 就是矩阵中下半部分三角形 18 if(fabs(plat[flag][i]) < fabs(plat[j][i])) 19 flag = j;//每次选取最大的系数来消掉其他系数, 最大程度的减少误差 20 } 21 if(fabs(plat[flag][i]) < eps) { //如果该位置系数等于零,则0x=a,一定无解 22 printf("No Solution"); 23 return 0; 24 } 25 if(i != flag) swap(plat[i], plat[flag]); 26 //对换一行,找最大当前系数, 这样可以只处理当前行的系数 27 double div = plat[i][i];//当前行的主元 28 for(int j = i; j <= n+1; j++) 29 plat[i][j] /= div;// 30 for(int j = i+1; j <= n; j++) { 31 div = plat[j][i]; //就能保证当前要消的这一列系数为0(下半个三角形 32 for(int k = i; k <= n+1; k++) 33 plat[j][k] -= plat[i][k]*div;//(解释不清楚自己手玩qaq 34 }//手玩一下就好啦quq 35 }//消元部分 36 ans[n] = plat[n][n+1]; 37 //经过上述操作, 最后一个(设为z)系数为一,答案为plat[n][n+1] 38 for(int i = n-1; i >= 1; i--) { 39 ans[i] = plat[i][n+1]; 40 for(int j = i+1; j <= n; j++) 41 ans[i] -= (plat[i][j]*ans[j]); 42 }//回带操作qaq依旧需要手玩 43 for(int i = 1; i <= n; i++) 44 printf("%.2lf ", ans[i]);//终于完结, 没劲撒花QAQ 45 return 0; 46 } 47 //希望下次看自己还能看懂orz