• 高斯消元 模板 (洛谷3389)


    题目背景

    Gauss消元

    题目描述

    给定一个线性方程组,对其求解

    输入输出格式

    输入格式:
    第一行,一个正整数 nn

    第二至 n+1n+1 行,每行 n+1n+1 个整数,为 a_1, a_2 cdots a_na
    1
    ​ ,a
    2
    ​ ⋯a
    n
    ​ 和 bb ,代表一组方程。

    输出格式:
    共n行,每行一个数,第 ii 行为 x_ix
    i
    ​ (保留2位小数)

    如果不存在唯一解,在第一行输出”No Solution”.

    输入输出样例

    输入样例#1: 复制
    3
    1 3 4 5
    1 4 7 3
    9 3 2 2
    输出样例#1: 复制
    -0.97
    5.18
    -2.39
    说明

    1≤n≤100

    高斯消元,思想就是每次选一个式子的一项,将其他的该式消去。时间复杂度O(n^3)。

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 105;
    const double eps = 1e-5;
    
    int n,where[MAXN];
    double ans[MAXN],x[MAXN][MAXN];
    
    inline void gauss(){
        for(register int i=1;i<=n;i++){
            int p=-1;
            double mx=0;
            for(register int j=1;j<=n;j++){
                if(fabs(x[i][j])-eps>mx)
                    mx=fabs(x[i][j]),p=j;
            }
            if(p==-1){   //特判多解与无解。
                printf("No Solution
    ");
                return;
            }
            where[i]=p;
            for(register int j=1;j<=n;j++){
                if(i==j) continue;
                double t=x[j][p]/x[i][p];
                for(register int k=1;k<=n+1;k++)
                    x[j][k]-=t*x[i][k];
            }   
        }
        for(register int i=1;i<=n;i++)
            ans[where[i]]=x[i][n+1]/x[i][where[i]];
        for(register int i=1;i<=n;i++)
            printf("%.2lf
    ",ans[i]);
    }
    
    int main(){
        scanf("%d",&n);
        for(register int i=1;i<=n;i++)
            for(register int j=1;j<=n+1;j++){
                scanf("%lf",&x[i][j]);
            }
        gauss();
        return 0;
    } 

    还有一个方法是消成三角形,这样便于求解行列式。
    代码郝神给的,%%%

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 105;
    const double eps = 1e-7;
    
    int n;
    double x[MAXN][MAXN];
    double ans[MAXN];
    
    inline void gauss(){
        int h=1,l=1;
        for(;h<=n && l<=n+1;h++,l++){
            int r=h;
            for(register int i=h+1;i<=n;i++) 
                if(fabs(x[i][l])>fabs(x[r][l])) r=i;
            if(fabs(x[r][l])<eps) {h--;continue;}
            if(h!=r) 
                for(register int i=l;i<=n+1;i++) 
                    swap(x[h][i],x[r][i]);
            for(register int i=h+1;i<=n;i++)
                if(fabs(x[i][l])>eps){
                    double t=x[i][l]/x[h][l];
                    for(register int j=l+1;j<=n+1;j++)
                        x[i][j]-=x[h][j]*t;
                    x[i][l]=0;
                }
        }
        for(register int i=h;i<=n;i++)
            if(fabs(x[i][n+1])>eps) {
                puts("No Solution");
                return;
            }
        if(h<n+1) {puts("No Solution");return;}
        for(register int i=n;i>=1;i--){
            double tmp=x[i][n+1];
            for(register int j=i+1;j<=n;j++)
                tmp-=ans[j]*x[i][j];
            ans[i]=tmp/x[i][i];
        }
        for(register int i=1;i<=n;i++)
            printf("%.2lf
    ",ans[i]);
    }
    
    int main(){
        scanf("%d",&n);
        for(register int i=1;i<=n;i++)
            for(register int j=1;j<=n+1;j++)
                scanf("%lf",&x[i][j]);
        gauss();
        return 0;
    }
  • 相关阅读:
    hadoop作业
    爬虫综合大作业
    爬取全部校园新闻
    理解爬虫原理
    中文词频统计与词云生成
    复合数据类型,英文词频统计
    字符串操作、文件操作,英文词频统计预处理
    了解大数据的特点、来源与数据呈现方式
    Hadoop综合大作业
    分布式文件系统HDFS
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677112.html
Copyright © 2020-2023  润新知