MnZn刚学高斯消元1ms 求助

P2455 [SDOI2006] 线性方程组

wyf_sinon @ 2024-01-04 19:30:35

pts80+hack2WA 求助

其中会输出-0???

#include<bits/stdc++.h>
using namespace std;
#define DB double 
const int N=105;
DB a[N][N],b[N];
DB eps=1e-7;
int n;
void ct()//方便调试
{
        for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
        cout<<b[i];
        puts("");
    }
    return ;
}
signed main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
        scanf("%lf",&b[i]);
    }
    bool flag = true;
    for(int i=1;i<=n;i++) // 解出xi并消去剩余xi的系数
    {
        bool f = false;
        for(int j=i;j<=n;j++)
        {
            if(fabs(a[j][i])>eps) //找到一个xi系数不为0的方程
            {
                for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
                swap(b[i],b[j]); 
                f=true; 
            }
        }
        if(f) flag=false; //xi多解
        for(int j=1;j<=n;j++)
        {
            if(i==j) continue;
            DB rate=a[j][i]/a[i][i];
            for(int k=i;k<=n;k++)
                a[j][k]-=a[i][k]*rate;
            b[j]-=b[i]*rate;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(fabs(a[i][i])<eps&&fabs(b[i])>eps)
        {
            puts("-1"); //无解
            exit(0);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j) continue;
            if(fabs(a[i][j])>eps) 
            {
                printf("0"); //多元即多解
                exit(0);
            }
        }
    }
    if(flag)
    {
        printf("0"); 
        exit(0);     
    }
    for(int i=1;i<=n;i++) 
        printf("x%d=%.2f\n", i , b[i]/a[i][i] );
    return 0;
}

by wyf_sinon @ 2024-01-04 19:33:09

上面改了一点结果变成60了?


by wyf_sinon @ 2024-01-04 19:35:26

pts80代码

#include<bits/stdc++.h>
using namespace std;
#define DB double 
const int N=105;
DB a[N][N],b[N];
DB eps=1e-7;
int n;
void ct()
{
        for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
        cout<<b[i];
        puts("");
    }
    return ;
}
signed main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
        scanf("%lf",&b[i]);
    }
    for(int i=1;i<=n;i++) // 解出xi并消去剩余xi的系数
    {
        bool f = false;
        for(int j=i;j<=n;j++)
        {
            if(fabs(a[j][i])>eps) //找到一个xi系数不为0的方程
            {
                for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
                swap(b[i],b[j]); 
                f=true;
            }
        }
        if(!f)
        {
            printf("0");
            exit(0);
        }
        for(int j=1;j<=n;j++)
        {
            if(i==j) continue;
            DB rate=a[j][i]/a[i][i];
            for(int k=i;k<=n;k++)
                a[j][k]-=a[i][k]*rate;
            b[j]-=b[i]*rate;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(fabs(a[i][i])<eps&&fabs(b[i])>eps)
        {
            puts("-1");
            exit(0);
        }
        for(int j=1;j<=n;j++)
        {
            if(i==j) continue;
            if(fabs(a[i][j])>eps) 
            {
                printf("0");
                exit(0);
            }
        }
    }

    for(int i=1;i<=n;i++) 
        printf("x%d=%.2f\n", i , b[i]/a[i][i] );
    return 0;
}

by Y_QWQ_Y @ 2024-02-10 21:00:33

@wyf_sinon 因为 double 把 0 算作负数,应该判断是否为 -0,强行转化成 0。


by wyf_sinon @ 2024-02-19 08:42:20

原来是这样吗(吃惊


|