高斯消元总结
来源:互联网 发布:信用社支票打印软件 编辑:程序博客网 时间:2024/06/05 16:58
这个超级简单啦。
就是初中都会的解方程的概括啦。
就是不断消元啦。
直接上模板
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define N 205#define ll long long#define eps 1e-8#define PN ""using namespace std;int t,n,m;double a[N][N];double fabs(double a){ if(a<0)return -a; else return a;}void guass(){ int cnt=0; for(int i=1;i<=n;i++){ int j=-1; for(int k=cnt+1;k<=m;k++) if(fabs(a[k][i])>eps){ j=k; break; } if(j==-1)continue; for(int k=i;k<=n+1;k++) swap(a[j][k],a[cnt+1][k]); for(int k=1;k<=m;k++){ if(k==cnt+1)continue; if(fabs(a[k][i])<eps)continue; double r=a[k][i]/a[cnt+1][i]; for(int p=i;p<=n+1;p++) a[k][p]-=a[cnt+1][p]*r; } cnt++; } if(cnt!=n){ printf("No solution or more than one solution.\n"); return; } for(int i=cnt+1;i<=m;i++) if(fabs(a[i][n+1])>eps){ printf("No solution or more than one solution.\n"); return; } for(int i=1;i<=n;i++) printf("%.2lf ",a[i][n+1]/a[i][i]); printf("\n");}int main(){ freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); guass(); } return 0;}
阅读全文
0 0