• 高斯消元求解线性方程组


    http://202.120.80.191/problem.php?problemid=1040

    裸题 

    Description 

    应用高斯消元法求解n*n的线性方程组Ax=b,其中A为系数矩阵。
    数据保证有唯一解。

    Input 

    第1行为一个整数n(0<n<=20),表示是n*n的的线性方程组。
    接下去的n行表示了系数矩阵A,每行有n个整数。
    再接下去的n行表示了b,每行只有一个整数。

    Output 

    输出有n行,每行有1个小数(精确到0.01),表示方程组的解。

    Sample Input 

    3
    1 2 3
    2 4 5
    3 1 2
    4
    3
    1

    Sample Output 

    -1.40
    -4.80
    5.00

    ps:手写了个高斯消元 AC,超爽 ,注意要对double 0的情况特殊处理

    #include<stdio.h>
    #include<math.h>
    #include<iostream>
    using namespace std;
    #define eps 1e-8  
    #define zero(a) fabs(a)<eps
    
    double map[29][29];
    double ret[29];
    
    void mat(int n){
        int i,j,k,ti;
        for(k=1;k<n;k++){
            int firsti=-1;
            double map_i_k;
            for(i=k;i<=n;i++){
                if(firsti==-1){
                    if(zero(map[i][k])){
                        for(ti=i+1;ti<=n;ti++){
                            if(!zero(map[ti][k]))break;
                        }
                        if(ti==n+1)break;
                        for(j=1;j<=(n+1);j++){
                            swap(map[i][j],map[ti][j]);
                        }
                    }
                    firsti=i;
                }
    
                if(zero(map[i][k]))continue;
                map_i_k=map[i][k];
                for(j=1;j<=(n+1);j++){
                    map[i][j]/=map_i_k;
                }
                if(firsti==-1)continue;
                if(firsti==i)continue;
                for(j=1;j<=(n+1);j++){
                    map[i][j]-=map[firsti][j];
                }
            }
        }
    
        //test
        //for(i=1;i<=n;i++)ret[i]=0;
        //for(i=1;i<=n;i++){
        //    for(j=1;j<=n;j++){
        //        if(!zero(map[i][j]))break;
        //    }
        //    if(j==n+1)continue;
        //    ret[j]=map[i][n+1]/map[i][j];
        //}
        //for(j=1;j<=n;j++){
        //    printf("%.2lf
    ",ret[j]);
        //}
    
        //for(i=1;i<=n;i++){
        //    for(j=1;j<=(n+1);j++){
        //        printf("%.8lf ",map[i][j]);
        //    }printf("
    ");
        //}
        //
        for(i=n;i>=1;i--){
            for(j=n;j>i;j--){
                map[i][n+1]-=map[i][j]*ret[j];
            }
            ret[i]=map[i][n+1]*1.0/map[i][i];
        }
    }
    
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            int i,j;
            for(i=1;i<=n;i++){
                for(j=1;j<=n;j++){
                    scanf("%lf",&map[i][j]);
                }
            }
            for(i=1;i<=n;i++){
                scanf("%lf",&map[i][n+1]);
            }
            mat(n);
            for(i=1;i<=n;i++){
                if(zero(ret[i]))printf("0.00
    ");
                else
                printf("%.2lf
    ",ret[i]);
            }
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    解决通用串行总线(USB)控制器有感叹号
    开发者需要了解的WebKit
    Win7系统搭建WiFi热点详细攻略
    给Qt生成的exe执行程序添加版本信息
    IIS(IISReset.exe)命令行
    .net开发微信公众平台
    使用ExitProcess()结束本进程、TerminateProcess 结束进程
    Hosts文件路径及修改方法
    本地动态SQL
    Oracle Package
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3384791.html
Copyright © 2020-2023  润新知