【高斯消元】洛谷P3389 高斯消元

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82663681

链接

https://www.luogu.org/problemnew/show/P3389


大意

求解一个 n 元一次线性方程


思路

高斯消元
(说白了就是用计算机模拟加减消元)


代码

#include<cstdio>
#include<cmath>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;int n;
double b[101],c[101][101];
inline void swap(register double &x,register double &y){double t=x;x=y;y=t;return;}\
signed main()
{
    scanf("%d",&n);
    r(i,1,n)
    {
        r(j,1,n) scanf("%lf",&c[i][j]);
        scanf("%lf",&b[i]);
    }
    r(i,1,n) 
    {
        r(j,i+1,n) 
        if(fabs(c[j][i]>1e-8)) //变换矩阵
        {
            r(k,1,n) swap(c[i][k],c[j][k]);
            swap(b[i],b[j]);
        }
        r(j,1,n)
        {
            if(i==j) continue;
            double rnt=c[j][i]/c[i][i];
            r(k,i,n) c[j][k]-=c[i][k]*rnt;//消元
            b[j]-=b[i]*rnt;
        }
    }
    r(i,1,n) if(!c[i][i])return printf("No Solution")&0;
    r(i,1,n) printf("%.2lf\n",b[i]/c[i][i]);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82663681