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;
模板:(异或方程组,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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人