298 字
1 分钟
[SDOI2007] 线性方程组 高斯消元模板

【问题描述】#

已知 n 元线性一次方程组。
a1,1x1+a1,2x2++a1,nxn=b1a_{1,1}x_1+a_{1,2}x_2+…+a_{1,n}x_n=b_1
a2,1x1+a2,2x2++a2,nxn=b2a_{2,1}x_1+a_{2,2}x_2+…+a_{2,n}x_n=b_2
………… an,1x1+an,2x2++an,nxn=bna_{n,1}x_1+a_{n,2}x_2+…+a_{n,n}x_n=b_n
其中: n<=50.系数是整数,绝对值<=100 , bi的值都是正整数且<300。 编程任务: 根据输入的数据,编程输出方程组的解的情况。

【输入】#

第一行,未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。 nn a1,1a1,2a1,nb1a_{1,1} a_{1,2} … a_{1,n} b_1 a2,1a2,2a2,nb2a_{2,1} a_{2,2} … a_{2,n} b_2 ………… an,1an,2an,nbna_{n,1} a_{n,2} … a_{n,n} b_n

【输出】#

如果方程组无实数解输出−1
如果有无穷多实数解,输出 0
如果有唯一解,则输出解(小数点后保留两位小数,如果解是0,则不保留小数)

【样例输入】#

3
2 -1 1 1
4 1 -1 5
1 1 1 0

【样例输出】#

x1=1.00
x2=0
x3=-1.00

题解#

高斯消元板子

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
double a[200][200],b[200],x[200];
int gauss(){
    int im,num=1;
    for(int k=1;k<=n;k++,num++){
        im=k;
        for(int i=k+1;i<=n;i++){
            if(fabs(a[i][k])>fabs(a[im][k]))
                im=i;
        }
        if(im!=k){
            for(int i=k;i<=n;i++)
                swap(a[num][i],a[im][i]);
            swap(b[num],b[im]);
        }
        if(!a[num][k]) {num--;continue;}
        for(int i=num+1;i<=n;i++){
            if(!a[num][k]) continue;
            double t=a[i][k]/a[num][k];
            for(int j=k;j<=n+1;j++)
                a[i][j]-=t*a[k][j];
            b[i]-=t*b[k];
        }
    }
    for(int i=num;i<=n;i++)
        if(!a[i][n]&&b[i])
            return -1;
    for(int i=n;i>=1;i--){
        for(int j=n;j>=i+1;j--)
            b[i]-=a[i][j]*x[j];
        if(!a[i][i]&&b[i]!=0)
            return -1;
        if(!a[i][i]&&!b[i])
            return 0;
        x[i]=b[i]/a[i][i];
    }
    return 1;
}
int main()
{
    //freopen("gaess.in","r",stdin);
    //freopen("gaess.out","w",stdout);
    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]);
    }
    int s=gauss();
    if(s!=1)
        printf("%d",s);
    else {
        for(int i=1;i<=n;i++){
            if(x[i]==0)
                printf("x%d=0\n",i);
            else{
                printf("x%d=%.2lf\n",i,x[i]);
            }
        }
    }
    //while(1);
}
[SDOI2007] 线性方程组 高斯消元模板
https://www.nekomio.com/posts/17/
作者
NekoMio
发布于
2017-06-19
许可协议
CC BY-NC-SA 4.0