高斯消元是线性代数的一种算法,可用来求解线性方程组问题。
线性方程三大基本操作:
1)两方程互换,解不变;
2)一方程乘以非零数k,解不变;
3)一方程乘以数k加上另一方程,解不变
1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 const int N=110; 6 const double eps=1e-6; 7 double a[N][N]; 8 int n; 9 10 int gauss(){ 11 int r,c; 12 for(r=0,c=0;c<n;c++){ 13 //1.找到绝对值最大的 14 int t=r; 15 for(int i=r;i<n;i++) 16 if(fabs(a[i][c])>fabs(a[t][c])) 17 t=i; 18 if(fabs(a[t][c])<eps) continue; 19 //2.把最大的换到上边 20 for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]); 21 //3.把最大的c列变成1 22 for(int i=n;i>=c;i--) a[r][i]/=a[r][c]; 23 //4.把下边的c列都变成0 24 for(int i=r+1;i<n;i++) 25 if(fabs(a[i][c])>eps) 26 for(int j=n;j>=c;j--) 27 a[i][j]-=a[r][j]*a[i][c]; 28 r++; 29 } 30 if(r<n){ 31 for(int i=r;i<n;i++){ 32 if(fabs(a[i][n])>eps){ 33 return 1; 34 } 35 } 36 return 2; 37 } 38 for(int i=n-1;i>=0;i--){ 39 for(int j=i+1;j<n;j++){ 40 a[i][n]-=a[i][j]*a[j][n]; 41 } 42 } 43 return 0; 44 } 45 int main(void){ 46 cin>>n; 47 for(int i=0;i<n;i++){ 48 for(int j=0;j<=n;j++){ 49 cin>>a[i][j]; 50 } 51 } 52 int t=gauss(); 53 if(t==0){ 54 for(int i=0;i<n;i++){ 55 printf("%.2lf ",a[i][n]); 56 } 57 }else if(t==1){ 58 cout<<"No solution"<<endl; 59 }else if(t==2){ 60 cout<<"Infinite group solutions"<<endl; 61 } 62 return 0; 63 }
异或版本的高斯消元
1 #include<iostream> 2 using namespace std; 3 const int N=110; 4 int n; 5 int a[N][N]; 6 int gauss(){ 7 int r,c; 8 for(r=0,c=0;c<n;c++){ 9 //找到1 10 int t=r; 11 for(int i=r;i<n;i++) 12 if(a[i][c]){ 13 t=i; 14 break; 15 } 16 if(a[t][c]==0) continue; 17 //换上去 18 for(int i=c;i<=n;i++){ 19 swap(a[r][i],a[t][i]); 20 } 21 //异或下边的 22 for(int i=r+1;i<n;i++){ 23 if(a[i][c]){ 24 for(int j=c;j<=n;j++){ 25 a[i][j]^=a[r][j]; 26 } 27 } 28 } 29 r++; 30 } 31 if(r<n){ 32 for(int i=r;i<n;i++){ 33 if(a[i][n]){ 34 return 1; 35 } 36 } 37 return 2; 38 } 39 for(int i=n-1;i>=0;i--){ 40 for(int j=i+1;j<n;j++){ 41 a[i][n]^=a[i][j]&a[j][n];//a[i][j]为1时异或第j行 42 } 43 } 44 return 0; 45 } 46 int main(void){ 47 cin>>n; 48 for(int i=0;i<n;i++){ 49 for(int j=0;j<=n;j++){ 50 cin>>a[i][j]; 51 } 52 } 53 int t=gauss(); 54 if(t==0){ 55 for(int i=0;i<n;i++){ 56 cout<<a[i][n]<<endl; 57 } 58 }else if(t==1){ 59 cout<<"No solution"; 60 }else if(t==2){ 61 cout<<"Multiple sets of solutions"; 62 } 63 return 0; 64 }