1. 程式人生 > >高斯消元法

高斯消元法

scanf string tac 最大 span cstring 方程 vector tdi

高斯消元法。直接附代碼了,這個代碼沒有回帶的。

 1 //Writer : Hsz %WJMZBMR%tourist%hzwer
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 #include<set>
 9 #include<stack>
10 #include<vector>
11 #include<cstdlib>
12
#include<algorithm> 13 #define LL long long 14 using namespace std; 15 int n,w[105]; 16 const double eps=1e-8; 17 double a[105][105],b[105],v[105]; 18 void gauss() { 19 for(int i=1; i<=n; i++) {//枚舉每個方程,並記錄每個該方程最大的系數 20 int p=0; 21 double mx=0; 22 for(int j=1; j<=n; j++)
23 if(fabs(a[i][j])-eps>mx) mx=fabs(a[i][j]),p=j; 24 if(!p) { 25 printf("No Solution"); 26 return; 27 } 28 w[i]=p; 29 for(int j=1; j<=n; j++) 30 if(i!=j) { 31 double tt=a[j][p]/a[i][p]; 32 for
(int k=1; k<=n+1; k++)//記得把方程右邊的結果也要消 33 a[j][k]-=a[i][k]*tt;  //消元,消到這個方程的系數構成的矩陣每行只有一個為0,每列只有一個為0. 34 } 35 } 36 for(int i=1; i<=n; i++) v[w[i]]=a[i][n+1]/a[i][w[i]];//用v[]記錄答案,w[]表示的是未消掉的那個元的位置。 37 for(int i=1; i<=n; i++) printf("%.2lf\n" ,v[i]); 38 } 39 int main() { 40 cin>>n; 41 for(int i=1; i<=n; i++) 42 for(int j=1; j<=n+1; j++) 43 scanf("%lf",&a[i][j]); 44 45 gauss(); 46 return 0; 47 }

高斯消元法