高斯消元

高斯-约旦消元法

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;
}
 

  

posted @ 2022-09-23 15:07  Bertidurlah  阅读(29)  评论(0)    收藏  举报