高斯消元

 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]);
}

 

posted @ 2022-04-30 11:30  YHXo  阅读(26)  评论(0编辑  收藏  举报