高斯消元总结

来源:互联网 发布:信用社支票打印软件 编辑:程序博客网 时间: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;}
原创粉丝点击