高斯-约旦消元法
P3389 【模板】高斯消元法
#include<bits/stdc++.h>
#define il inline
#define ri register int
#define ru register unsigned int
#define debug printf("Now is %d\n",__LINE__);
using namespace std;
int n;
double a[105][105];
il double read()
{
int as=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') as=(as<<3)+(as<<1)+(ch^48),ch=getchar();
return as*f;
}
il void Gauss()
{
for(ru i=1;i<=n;++i)//line
{
int id=i;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(ru j=i+1;j<=n;++j)
if(fabs(a[j][i])>fabs(a[id][i])) id=j;
swap(a[i],a[id]);
if(!a[i][i]){printf("No Solution");exit(0);}
for(ru j=1;j<=n;++j)
if(j!=i)
{
double d=a[j][i]/a[i][i];
for(ru k=i+1;k<=n+1;++k)
a[j][k]-=a[i][k]*d;
}
}
return;
}
int main()
{
n=read();
for(ru i=1;i<=n;++i)
for(ru j=1;j<=n+1;++j) a[i][j]=read();
Gauss();
for(ru i=1;i<=n;++i) printf("%.2lf\n",a[i][n+1]/a[i][i]);
return 0;
}
朴素高斯消元
P2455 [SDOI2006]线性方程组
#include<bits/stdc++.h>
#define il inline
#define ri register int
#define ru register unsigned int
#define debug printf("Now is %lf\n",__LINE__);
#define random(a,b) ((a)+rand()%((b)-(a)+1))
double a[110][110];
int n;
const double eps=1e-6;//double!!!!!!!!!!!!!!!!!!
using namespace std;
il void Gauss()
{
int r,c;
for(r=1,c=1;c<=n;++c)
{
int max_=r;
for(ru i=r;i<=n;++i)
if(fabs(a[max_][c])<fabs(a[i][c])) max_=i;
if(fabs(a[max_][c])<=eps) continue;
swap(a[r],a[max_]);
for(ru i=n+1;i>=c;i--) a[r][i]/=a[r][c];
for(ru i=r+1;i<=n;++i)
{
if(fabs(a[i][c])<=eps) continue;
for(ru j=n+1;j>=c;--j)
a[i][j]-=a[r][j]*a[i][c];
}
++r;
}
if(r<=n)// <=
{
for(ru i=r;i<=n;++i)// r
if(fabs(a[i][n+1])>eps) // n+1
{putchar('-'),putchar('1');exit(0);}//无解
putchar('0');exit(0);//多解
}
for(ru i=n-1;i>=1;i--)
for(ru j=i+1;j<=n;++j)
a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main()
{
scanf("%d",&n);
for(ru i=1;i<=n;++i)
for(ru j=1;j<=n+1;++j)
scanf("%lf",&a[i][j]);
Gauss();
for(ru i=1;i<=n;++i)
printf("x%d=%.2lf\n",i,a[i][n+1]);
return 0;
}