• P3389 【模板】高斯消元法


    题目背景

    Gauss消元

    题目描述

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

    输入输出格式

    输入格式:

    第一行,一个正整数 nn

    第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 cdots a_na1​​,a2​​an​​ 和 bb,代表一组方程。

    输出格式:

    共n行,每行一个数,第 ii行为 x_ixi​​ (保留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 leq n leq 100, left | a_i ight| leq {10}^4 , left |b ight| leq {10}^41n100,ai​​104​​,b104​​

    本来想深入的研究一下矩阵来着,,

    结果不知道怎么着的研究到高斯消元上了,。。。。

    高斯消元法真是一个神(bao)奇(li)的的东西、

    本来想仔细整理整理来着,结果发现我不会在博客园里写矩阵,

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 //#define Matrix double
     6 using namespace std;
     7 const int MAXN=101;
     8 typedef double Matrix[MAXN][MAXN];
     9 inline void read(int &n)
    10 {char c=getchar();bool flag=0;
    11 while(c<'0'||c>'9')        c=='-'?flag=1,c=getchar():c=getchar();
    12 while(c>='0'&&c<='9')    n=n*10+c-48,c=getchar();flag==1?n=-n:n=n;}
    13 int n;
    14 Matrix a;
    15 void debug()
    16 {
    17     /*printf("********************************
    ");
    18     for(int i=1;i<=n;i++)
    19     {
    20         for(int j=1;j<=n+1;j++)    printf("%.2lf ",a[i][j]);
    21         printf("
    ");
    22     }*/
    23 }
    24 void gauss_elimination(int n)
    25 {
    26     int r;// 将要选择的最大值 
    27     for(int i=1;i<=n;i++)
    28     {
    29         r=i;
    30         for(int j=i+1;j<=n;j++)// 枚举后面的行 
    31             if(fabs(a[j][i])>fabs(a[r][i]))    r=j;
    32         debug();
    33         if(r!=i)    swap(a[r],a[i]);
    34         debug();
    35         if(!a[i][i])
    36         {
    37             printf("No Solution
    ");
    38             return;
    39         }
    40         for(int k=i+1;k<=n;k++)// 与后面的进行消元
    41         {
    42             double f=a[k][i]/a[i][i];//模拟人工消元 
    43             for(int j=i;j<=n+1;j++)    a[k][j]-=f*a[i][j];
    44         } 
    45         debug();
    46     }
    47     debug();
    48     for(int i=n;i>=1;i--)
    49     {
    50         debug();
    51         for(int j=i+1;j<=n;j++)
    52             a[i][n+1]-=a[j][n+1]*a[i][j];
    53         a[i][n+1]/=a[i][i];
    54     }
    55     for(int i=1;i<=n;i++)
    56         printf("%.2lf
    ",a[i][n+1]);
    57 }
    58 int main()
    59 {
    60     read(n);
    61     for(int i=1;i<=n;i++)
    62         for(int j=1;j<=n+1;j++)
    63             scanf("%lf",&a[i][j]);
    64     gauss_elimination(n);            
    65     return 0;
    66 }
  • 相关阅读:
    hive 求多列中的最大值、最小值
    HIVE UDAF 编写
    JAVA实现接口
    hivegrouping sets用法及grouping_id计算方法
    好用的开源项目
    Vue2切换生产环境、测试环境和开发环境
    hping3工具使用介绍
    Slowhttptest工具介绍
    输出字符菱形
    windows平台下sublime配置python开发环境
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7367862.html
Copyright © 2020-2023  润新知