• [Luogu 3389]【模板】高斯消元法


    Description

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

    Input

    第一行,一个正整数 n

    第二至 n+1 行,每行 n+1 个整数,为a1,a2⋯an和 b,代表一组方程。1​​,a2​​an​​ 和 bbb,代表一组方程。

    Output

    共n行,每行一个数,第 i 行为 xi

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

    Sample Input

    3
    1 3 4 5
    1 4 7 3
    9 3 2 2

    Sample Output

    -0.97
    5.18
    -2.39

    HINT

    题解

    矩阵变换:
    一、交换变换:$R_i<->R_j$,表示将$R_i$与$R_j$的所有元素对应交换
    二、倍法变换:$R_i=R_i*k$,表示将$R_i$行的所有元素都乘上一个常数$k$
    三、消去变换:$R_i=R_i+R_j*k$,表示将$R_i$行的所有元素对应的加上$R_j$行元素的$k$倍
    ------------------------------------------------------------------
    实数解直接加减消元
    整数解消元的时候用最小公倍数消去目标系数
    ------------------------------------------------------------------
    ① 无解 当方程中出现$(0, 0, …, 0, a)$的形式,且$a != 0$时,说明是无解的。
    ② 唯一解 形成了严格的上三角阵
    ③ 无穷解 不能形成严格的上三角形

     1 //It is made by Awson on 2017.10.10
     2 #include <set>
     3 #include <map>
     4 #include <cmath>
     5 #include <ctime>
     6 #include <cmath>
     7 #include <stack>
     8 #include <queue>
     9 #include <vector>
    10 #include <string>
    11 #include <cstdio>
    12 #include <cstdlib>
    13 #include <cstring>
    14 #include <iostream>
    15 #include <algorithm>
    16 #define LL long long
    17 #define Min(a, b) ((a) < (b) ? (a) : (b))
    18 #define Max(a, b) ((a) > (b) ? (a) : (b))
    19 #define sqr(x) ((x)*(x))
    20 using namespace std;
    21 const int N = 100;
    22 
    23 int n;
    24 double a[N+5][N+5];
    25 
    26 void Gauss() {
    27   for (int line = 1; line <= n; line++) {
    28     int Max_line = line;
    29     for (int i = line+1; i <= n; i++)
    30       if (fabs(a[i][line]) > fabs(a[Max_line][line]))
    31     Max_line = i;
    32     if (Max_line != line) swap(a[line], a[Max_line]);
    33     if (a[line][line] == 0) {
    34       printf("No Solution
    ");
    35       return;
    36     }
    37     for (int i = line+1; i <= n; i++) {
    38       double tmp = a[i][line]/a[line][line];
    39       for (int j = line; j <= n+1; j++)
    40     a[i][j] -= a[line][j]*tmp;
    41     }
    42   }
    43   for (int i = n; i >= 1; i--) {
    44     for (int j = i+1; j <= n; j++)
    45       a[i][n+1] -= a[j][n+1]*a[i][j];
    46     a[i][n+1] /= a[i][i];
    47   }
    48   for (int i = 1; i <= n ;i++)
    49     printf("%.2lf
    ", a[i][n+1]);
    50 }
    51 void work() {
    52   scanf("%d", &n);
    53   for (int i = 1; i <= n; i++)
    54     for (int j = 1; j <= n+1; j++)
    55       scanf("%lf", &a[i][j]);
    56   Gauss();
    57 }
    58 int main() {
    59   work();
    60   return 0;
    61 }
  • 相关阅读:
    字符串右移n位(C++实现)
    字符串反转实现(C++)
    MSDN无法显示该页的解决办法
    设计模式——单例模式 (C++实现)
    设计模式——工厂模式 (C++实现)
    设计模式课程 设计模式精讲 24-2 中介者模式coding
    设计模式课程 设计模式精讲 25-1 责任链模式讲解
    设计模式课程 设计模式精讲 23-3 命令模式源码解析
    设计模式课程 设计模式精讲 23-2 命令模式coding
    设计模式课程 设计模式精讲 22-3 备忘录模式源码解析
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/7645133.html
Copyright © 2020-2023  润新知