洛谷 P3389 【模板】高斯消元法

以下这个好像叫高斯约旦消元法,没有回代

https://www.luogu.org/blog/37781/solution-p3389

#include<cstdio>
#include<algorithm>
#include<cmath>
#define eps 1e-7
using namespace std;
double a[110][110];
int n;
void swap_line(int x,int y)
{
    for(int i=1;i<=n+1;i++)    swap(a[x][i],a[y][i]);
}
int dcmp(double x)
{
    if(fabs(x)<eps)    return 0;
    else    return x>0?1:-1;
}
int main()
{
    int i,j,k,nx;double nmax,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);
    for(i=1;i<=n;i++)
    {
        nmax=0;
        for(j=i;j<=n;j++)
            if(fabs(a[j][i])>fabs(nmax))
            {
                nmax=a[j][i];
                nx=j;
            }
        if(dcmp(nmax)==0)
        {
            puts("No Solution");
            return 0;
        }
        swap_line(nx,i);
        for(j=1;j<=n+1;j++)    a[i][j]/=nmax;
        for(j=1;j<=n;j++)
            if(j!=i)
            {
                t=a[j][i]/a[i][i];//可以直接t=a[j][i];因为a[i][i]一定是1
                for(k=1;k<=n+1;k++)
                    a[j][k]-=t*a[i][k];
            }
    }
    for(i=1;i<=n;i++)    printf("%.2lf\n",a[i][n+1]);
    return 0;
}

还可以卡常

#include<cstdio>
#include<algorithm>
#include<cmath>
#define eps 1e-7
using namespace std;
double a[110][110];
int n;
void swap_line(int x,int y)
{
    for(int i=1;i<=n+1;i++)    swap(a[x][i],a[y][i]);
}
int dcmp(double x)
{
    if(fabs(x)<eps)    return 0;
    else    return x>0?1:-1;
}
int main()
{
    int i,j,k,nx;double nmax;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);
    for(i=1;i<=n;i++)
    {
        nmax=0;
        for(j=i;j<=n;j++)
            if(fabs(a[j][i])>fabs(nmax))
            {
                nmax=a[j][i];
                nx=j;
            }
        if(dcmp(nmax)==0)
        {
            puts("No Solution");
            return 0;
        }
        swap_line(nx,i);
        for(j=i+1;j<=n+1;j++)    a[i][j]/=nmax;
        for(j=1;j<=n;j++)
            if(j!=i)
                for(k=i+1;k<=n+1;k++)
                    a[j][k]-=a[j][i]*a[i][k];
    }
    for(i=1;i<=n;i++)    printf("%.2lf\n",a[i][n+1]);
    return 0;
}
View Code

 

posted @ 2018-03-22 11:02  hehe_54321  阅读(148)  评论(0编辑  收藏  举报
AmazingCounters.com