AcWing算法提高课 高斯消元

高斯消元求解n元线性方程组

原理 先变上三角,再变对角矩阵,则此时 右边的值就是方程的解

步骤:

 

 模板:(n*n且保证有唯一解,即n个线性方程n个未知数且有唯一解)

复制代码
const int N=15;
double A[N][N]; 

int n;

void Gauss()
{
    //A矩阵存储了系数和右端项,即Ax=B的[A;B]
    //先按列枚举,变为上三角
    for(int r=1,c=1;c<=n;r++,c++)
    {
        //找主元
        int t=r;
        for(int i=r+1;i<=n;i++)
        {
            if(abs(A[i][c])>abs(A[t][c]))
                t=i;
        }
        //交换
        for(int i=c;i<=n+1;i++)
        {
            swap(A[r][i],A[t][i]);
        }
        //归一化
        for(int i=n+1;i>=c;i--)
        {
            A[r][i]/=A[r][c];
        }
        //消下面的行
        for(int i=r+1;i<=n;i++)
        {
            for(int j=n+1;j>=c;j--)
            {
                A[i][j]-=A[i][c]*A[r][j];
            }
        }
    }
    //转化为对角矩阵
    for(int i=n;i>1;i--)//从最后一列开始,向上消
    {
        for(int j=i-1;j>=1;j--)//枚举当前行的上面的行
        {
            A[j][n+1]-=A[j][i]*A[i][n+1];//只用变n+1列
            A[j][i]=0;//这列被消除
        }
    }
}


    Gauss();
    cout<<fixed<<setprecision(3);
    for(int i=1;i<=n;i++)
    {
        cout<<A[i][n+1]<<' ';
    }
    cout<<endl;
View Code
复制代码

 模板:(异或方程组,n*n,不保证有解需要判断)

复制代码
int n;
const int N=50;
int a[N][N];


int Gauss()
{
    int r,c;
    for(r=1,c=1;c<=n;c++)
    {
        //找主元
        int t=r;
        for(int i=r+1;i<=n;i++)
        {
            if(a[i][c])
                t=i;
        }
        //没有找到主元,即全为0,此时不能r++
        if(!a[t][c]) continue;
        //交换
        for(int i=c;i<=n+1;i++)
        {
            swap(a[r][i],a[t][i]);
        }
        //
        for(int i=r+1;i<=n;i++)
        {
            for(int j=n+1;j>=c;j--)
            {
                a[i][j]^=a[i][c]&a[r][j];
                //a[i][c]为1才用异或、a[r][j]为1异或后才会改变值
            }
        }
        //找到一个元才能到下一行
        r++;
    }
    int res=1;
    if(r<n+1)//自由元
    {
        for(int i=r;i<=n;i++)
        {
            if(a[i][n+1]!=0)//出现0==非0,无解
                return -1;
            
            //存在一个自由元,对于异或方程,可能有两种值
            res*=2;
        }
    }
    return res;
}
View Code
复制代码

 

posted @   80k  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示