高斯消元

算法理解

建议看这篇(和算法竞赛书上一模一样,也不知道谁抄谁的)

我对理解是就相当于是小学学的加减消元法,给他系统化了

#include<bits/stdc++.h>
using namespace std;
const int N=105;
const double eps=1e-7;
double a[N][N];
int n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++){
            scanf("%lf",&a[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        int mx=i;
        for(int j=i+1;j<=n;j++){//以前的行就不能动了,这也就是个小优化不用太较真
            if(fabs(a[j][i])>fabs(a[mx][i]))  mx=j;
        }
        for(int j=1;j<=n+1;j++){
            swap(a[i][j],a[mx][j]);
        }
        if(fabs(a[i][i])<eps){
            printf("No Solution\n");
            return 0;
        }
        for(int j=n+1;j>=1;j--){
            a[i][j]=a[i][j]/a[i][i];
        }
        for(int j=1;j<=n;j++){
            if(j!=i){
                double temp=a[j][i]/a[i][i];
                for(int k=1;k<=n+1;k++)  a[j][k]-=a[i][k]*temp;
            }
        }
    }
    for(int i=1;i<=n;i++){
        printf("%.2f\n",a[i][n+1]);
    }
    return 0;
}

T1:

推一下式子即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
double a[N][N],d[N][N];
int n;
void guass(){
    for(int i=1;i<=n;i++){
        int mx=i;
        for(int j=i;j<=n;j++){
            if(fabs(a[j][i])>fabs(a[mx][i])){
                mx=j;
            }
        }
        for(int j=1;j<=n+1;j++){
            swap(a[i][j],a[mx][j]);
        }
        for(int j=n+1;j>=i;j--){
            a[i][j]=a[i][j]/a[i][i];
        }
        for(int j=1;j<=n;j++){
            if(i!=j){
                double tmp=a[j][i]/a[i][i];
                for(int k=1;k<=n+1;k++){
                    a[j][k]-=a[i][k]*tmp;
                }
            }
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++){
        for(int j=1;j<=n;j++){
            scanf("%lf",&d[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        double cnt=0;
        for(int j=1;j<=n;j++){
            a[i][j]=2*d[i+1][j]-2*d[i][j];
            cnt+=d[i+1][j]*d[i+1][j]-d[i][j]*d[i][j];
        }
        a[i][n+1]=cnt;
    }
    guass();
    for(int i=1;i<=n;i++){
        printf("%.3lf ",a[i][n+1]);
    }
    return 0;
}

posted @ 2025-08-01 19:19  daydreamer_zcxnb  阅读(14)  评论(1)    收藏  举报