前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P3389 【模板】高斯消元法

P3389 【模板】高斯消元法

作者头像
attack
发布2018-04-12 10:45:40
1.9K0
发布2018-04-12 10:45:40
举报

题目背景

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:

代码语言:javascript
复制
3
1 3 4 5
1 4 7 3
9 3 2 2

输出样例#1:

代码语言:javascript
复制
-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)的的东西、

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

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目背景
  • 题目描述
  • 输入输出格式
  • 输入输出样例
  • 说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档