高斯消元

const int N=1000+10;
const ll MOD=1e9+7;
#define eps 1e-6
double a[N][N];
int n;
void jfc()
{
    int hang,lie;
    for(hang=0,lie=0;lie<n;++lie)
    {
        //以列为标准消元(还剩几列--还剩几个才能出现单独参数)
        int t=hang;
        _f(i,hang+1,n-1)if((a[i][lie]-a[t][lie])>eps)t=i;
        swap(a[t],a[hang]);
        if(fabs(a[hang][lie])<=eps)continue;
        //否则开始消消乐
        f_(i,n,lie)a[hang][i]/=a[hang][lie];//所有的都要除,包括得数
        _f(i,hang+1,n-1)
        {
            f_(j,n,lie)
            {
                a[i][j]-=a[i][lie]*a[hang][j];//消掉其他的不是也系数化1!!
            }
        }
        hang++;
    }
    if(hang<n)
    {
        _f(i,hang,n-1)if(a[i][n]!=0)return -1;
        return 0;
    }
    f_(i,n-1,0)//删哪列
    {
        f_(j,i-1,0)//删哪行
        {
            a[j][n]-=a[i][n]*a[j][i];
            a[j][i]=0;
        }
    }
        _f(i,0,n-1)
    if(fabs(a[i][n])<eps)
    chu("x%d=0\n",i+1);
    else
    chu("x%d=%.2lf\n",i+1,a[i][n]); 
}
int main()
{
    n=re();
    _f(i,0,n-1)
    {
        _f(j,0,n)
        {
            double lin;
            scanf("%lf",&lin);
            a[i][j]=lin;
        }
    }
    jfc();
    return 0;
}

 

posted on 2022-07-21 18:17  HZOI-曹蓉  阅读(23)  评论(0编辑  收藏  举报