298 字
1 分钟
[SDOI2007] 线性方程组 高斯消元模板
【问题描述】
已知 n 元线性一次方程组。
其中: n<=50.系数是整数,绝对值<=100 , bi的值都是正整数且<300。
编程任务:
根据输入的数据,编程输出方程组的解的情况。
【输入】
第一行,未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。
【输出】
如果方程组无实数解输出−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/