高斯消元
1 //高斯消元法(普通方程) 2 3 const int N=110; 4 const double eps=1e-7; 5 int n; 6 double a[N][N]; 7 8 int gauss(){ 9 int r,c; 10 for(c=0,r=0;c<n;c++){//枚举列 11 int t=r; 12 for(int i=r;i<n;i++) 13 if(fabs(a[i][c])>fabs(a[t][c])) t=i;//找当前这一列系数绝对值最大的一行 14 if(fabs(a[t][c]<eps)) continue;//没找到 15 for(int i=c;i<n+1;i++) swap(a[t][i],a[r][i]);//交换行 16 for(int i=n;i>=c;i--) a[r][i]/=a[r][c];//从后往前 17 18 for(int i=r+1;i<n;i++)//r+1行开始 19 if(fabs(a[i][c])>eps) 20 for(int j=n;j>=c;j--) 21 a[i][j]-=a[r][j]*a[i][c]; 22 r++; 23 } 24 if(r<n){ 25 for(int i=r;i<n;i++) 26 if(fabs(a[i][n])>eps) return 2;//无解 27 return 1;//无穷组解 28 } 29 for(int i=n-1;i>=0;i--) 30 for(int j=i+1;j<n;j++) 31 a[i][n]-=a[j][n]*a[i][j]; 32 return 0;//唯一解 33 }
1 //高斯消元解线性异或方程 2 3 #include<bits/stdc++.h> 4 using namespace std; 5 int n,a[120][120]; 6 int gauss(){ 7 int r,c; 8 for(r=0,c=0;c<n;c++){//枚举列 9 int t=r; 10 for(int i=r;i<n;i++) 11 if(a[i][c]){t=i;break;}//找到一个非0数 12 if(!a[t][c]) continue;//没找到,则continue 13 for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]);//交换两行 14 for(int i=r+1;i<n;i++)//从r+1行开始消0 15 if(a[i][c])//这个数不为0则异或 16 for(int j=c;j<=n;j++) 17 a[i][j]^=a[r][j]; 18 r++;//枚举行 19 } 20 //判断是否有解 21 if(r<n){ 22 for(int i=r;i<n;i++) 23 if(a[i][n]) return 2;//无解 24 return 1;//有无穷组解 25 } 26 for(int i=n-1;i>=0;i--) 27 for(int j=i+1;j<n;j++)//把每行后面的系数都消掉 28 a[i][n]^=a[i][j]&a[j][n];//只有1的时候才异或,用&运算 29 return 0;//唯一解 30 } 31 32 int main(){ 33 scanf("%d",&n); 34 for(int i=0;i<n;i++) 35 for(int j=0;j<n+1;j++) scnaf("%d",a[i][j]); 36 int res=gauss(); 37 if(res==0){ 38 for(int i=0;i<n;i++) cout<<a[i][n]<<endl; 39 } 40 else if(res==1) puts("Multiple sets of solutions"); 41 else puts("No solution"); 42 }
//Gauss-Jordan消元法 //洛谷P3389 #include<bits/stdc++.h> using namespace std; double a[105][105]; double eps=1e-7; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++){ int max=i; for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[max][i])) max=j; for(int j=1;j<=n+1;j++) swap(a[i][j],a[max][j]); if(a[i][i]<eps){ puts("No Solution"); return 0; } for(int j=n+1;j>=1;j--) a[i][j]=a[i][j]/a[i][i]; for(int j=1;j<=n;j++){ if(j!=i){ double temp=a[j][i]/a[i][i]; for(int k=1;k<=n+1;k++) a[j][k]-=a[i][k]*temp; } } } for(int i=1;i<=n;i++) printf("%0.2f\n",a[i][n+1]); }