zoukankan      html  css  js  c++  java
  • 洛谷 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
    ",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
    ",a[i][n+1]);
        return 0;
    }
    View Code
  • 相关阅读:
    进程池Pool
    进程间通信-Queue
    多任务版udp聊天器
    列表循环放引用并写出打印结果
    协程实现tcp两个客户端的通讯
    正则匹配身份证和邮箱
    python中上双互斥锁的线程执行流程
    小巧的http live streaming m3u8播放器
    js实现@提到好友
    mongoose多级嵌套操作
  • 原文地址:https://www.cnblogs.com/hehe54321/p/8622299.html
Copyright © 2011-2022 走看看