P3389 【模板】高斯消元法

2018-06-17 22:01:47来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

题目背景

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}^41n100,a?i??10?4??,b10?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 Solution\n");
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\n",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 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:HDU 1005 Number Sequence(矩阵)

下一篇:hdu 6121---Build a tree(深搜+思维)