高斯消元法解线性方程组
高斯消元解线性方程组
题目链接:acwing883. 高斯消元解线性方程组
问题描述
分析
高斯消元法解线性方程组的步骤就是线性代数中的矩阵行变换
矩阵可以进行如下三种行变换,不改变方程组的解:
1.将某一行扩大k(k!=0)倍
2.交换某两行
3.将第i行的k倍加到第j行
解线性方程组,需要将矩阵化成行最简型,然后就很容易求解了,看代码比较容易看懂
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=110;
const double eps=1e-6;
int n;
double f[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(fabs(f[i][c])>fabs(f[t][c])) t=i;
if(fabs(f[t][c])<eps) continue;
swap(f[r],f[t]);
for(int i=n+1;i>=c;i--) f[r][i]/=f[r][c];
for(int i=r+1;i<=n;i++)
if(fabs(f[i][c])>eps)
for(int j=n+1;j>=c;j--) f[i][j]-=f[i][c]*f[r][j];
r++;
}
if(r<n+1){
for(int i=r;i<=n;i++)
if(fabs(f[i][n+1])>eps) return 2;
return 1;
}
for(int i=n-1;i>=1;i--)
for(int j=n;j>i;j--) f[i][n+1]-=f[i][j]*f[j][n+1];
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++) scanf("%lf",&f[i][j]);
int t=gauss();
if(t==0)
for(int i=1;i<=n;i++) printf("%.2lf\n",f[i][n+1]);
else if(t==1) puts("Infinite group solutions");
else puts("No solution");
return 0;
}
高斯消元解异或线性方程组
题目链接:acwing884. 高斯消元解异或线性方程组
问题描述
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
bool f[N][N];
int n;
int gauss(){
int r,c;
for(r=1,c=1;c<=n;c++){
int t=r;
for(int i=r;i<=n;i++)
if(f[i][c]==1){
t=i;
break;
}
if(!f[t][c]) continue;
swap(f[r],f[t]);
for(int i=r+1;i<=n;i++)
if(f[i][c])
for(int j=c;j<=n+1;j++) f[i][j]^=f[r][j];
r++;
}
if(r<n+1){
for(int i=r;i<=n;i++)
if(f[i][n+1]) return 2;
return 1;
}
for(int i=n-1;i>=1;i--)
for(int j=n;j>i;j--)
if(f[i][j]) f[i][n+1]^=f[j][n+1];
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++) scanf("%d",&f[i][j]);
int t=gauss();
if(t==0)
for(int i=1;i<=n;i++) printf("%d\n",f[i][n+1]);
else if(t==1) puts("Multiple sets of solutions");
else puts("No solution");
return 0;
}