(高斯消元+模板题)acwing 883. 高斯消元解线性方程组

883. 高斯消元解线性方程组

题目链接
题目:
(高斯消元+模板题)acwing 883. 高斯消元解线性方程组_第1张图片
模拟线性代数中的高斯消元的步骤

#include
#include
#include
#include
using namespace std;
double a[110][110];
int n;
int gauss(){
    int r=0;//记录行,有几行存在1
    for(int c=0;c<n;c++){//c记录列
        int t=r;//找到c列中,从r行开始哪一行数的绝对值最大
        for(int i=r;i<n;i++){
            if(fabs(a[t][c])+1e-6<fabs(a[i][c])) t=i;
        }
        //第c列的元素从r行开始均为0,故不能r++;
        if(fabs(a[t][c])<1e-6) continue;
        if(t!=r)
        for(int i=0;i<n+1;i++)
            swap(a[r][i],a[t][i]);
          //将r行的第c列的数变为1;
        for(int i=n;i>=c;i--){//要倒着,避免a[r][c]改变影响后面
            a[r][i]/=a[r][c];
        }
        //把r+1行开始的第c列的数变为0
        for(int i=r+1;i<n;i++){
            for (int j = n; j >= c; j -- ){//这里也要倒着,不然a[i][c]影响后面
                a[i][j]-=a[i][c]*a[r][j];
            }
        }
        r++;
    }
    if(r<n){
        for(int j=r;j<n;j++){
            if(a[j][n]>1e-6)
                return 0;//无解
        }
        return 2;//无穷个解答
    }
    //从下往上开始清理每一行非第一个1的数,将他们只为1;
    for(int i=n-1;i>=0;i--){
        for(int j=i+1;j<n;j++){
            a[i][n]-=a[i][j]*a[j][n];
        }
    }
    return 1;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n+1;j++){
            scanf("%lf",&a[i][j]);
        }
    }
    int t=gauss();
    if(t==0) cout<<"No solution";
    else if(t==2) cout<<"Infinite group solutions";
    else{
        for(int i=0;i<n;i++)
            printf("%.2f\n",a[i][n]);
    }
    return 0;
}



你可能感兴趣的:(AcWing,高斯消元,算法)