883-884 高斯消元 打卡
作者:
不愿透露姓氏的高同学
,
2022-03-07 15:13:00
,
所有人可见
,
阅读 146
高斯消元解线性方程组
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=105;
const double der=1e-6;
double a[N][N];
int n;
inline bool isZero(double a)
{
return fabs(a)<der;
}
int gauss()
{
int r=1;
for(int c=1;c<=n;c++)
{
int sel_r=r;
for(int i=r+1;i<=n;i++)
if(fabs(a[i][c])>fabs(a[sel_r][c]))
sel_r=i;
if(isZero(a[sel_r][c])) continue;
if(sel_r!=r)
for(int i=c;i<=n+1;i++)
swap(a[sel_r][i],a[r][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[r][j]*a[i][c];
r++;
}
if(r==n+1)
{
for(int c=n;c>1;c--)
for(int i=c-1;i;i--)
a[i][n+1]-=a[c][n+1]*a[i][c];
for(int i=1;i<=n;i++)
if(isZero(a[i][n+1]))
a[i][n+1]=0;
return 1;//唯一解
}
for(int i=r;i<=n;i++)
if(!isZero(a[i][n+1]))
return -1;//矛盾
return 0;//无穷组解
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
int ret=gauss();
if(ret==1)
{
for(int i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]);
}else if(!ret)
puts("Infinite group solutions");
else
puts("No solution");
return 0;
}
高斯消元解异或线性方程组
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=105;
int a[N][N];
int n;
int gauss()
{
int r=1;
for(int c=1;c<=n;c++)
{
int sel_r=0;
for(int i=r;i<=n;i++)
if(a[i][c])
{
sel_r=i;
break;
}
if(!sel_r) continue;
if(sel_r!=r)
for(int i=c;i<=n+1;i++)
swap(a[sel_r][i],a[r][i]);
for(int i=r+1;i<=n;i++)
if(a[i][c])
for(int j=c;j<=n+1;j++)
a[i][j]^=a[r][j];
r++;
}
if(r==n+1)
{
for(int c=n;c>1;c--)
for(int i=1;i<c;i++)
if(a[i][c])
a[i][n+1]^=a[c][n+1];
return 1;
}
for(int i=r;i<=n;i++)
if(a[i][n+1])
return -1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%d",&a[i][j]);
int ret=gauss();
if(ret==1)
{
for(int i=1;i<=n;i++)
printf("%d\n",a[i][n+1]);
}else if(!ret) puts("Multiple sets of solutions");
else puts("No solution");
return 0;
}