P3389 【模板】高斯消元法

时间:2022-05-08
本文章向大家介绍P3389 【模板】高斯消元法,主要内容包括题目背景、题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

题目背景

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 leq n leq 100, left | a_i right| leq {10}^4 , left |b right| leq {10}^41≤n≤100,∣a​i​​∣≤10​4​​,∣b∣≤10​4​​

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

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

高斯消元法真是一个神(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("********************************n");
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("n");
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 Solutionn");
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("%.2lfn",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 }