「LuoguP3389」【模板】高斯消元法

题目背景

Gauss消元

题目描述

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

输入输出格式

输入格式:

第一行,一个正整数 nn

第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 cdots a_na1,a2an 和 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,ai104,b104

题解

这个东西从寒假拖到现在qwq

大概是自己变强了吧,觉得写起来蛮轻松的qwq

 1 /*
 2 qwerta 
 3 P3389 【模板】高斯消元法 Accepted 
 4 100
 5 代码 C++,0.95KB
 6 提交时间 2018-11-02 07:49:21
 7 耗时/内存 36ms, 800KB
 8 */
 9 #include<iostream>
10 #include<cstdio>
11 #include<cmath>
12 using namespace std;
13 double a[103][104];
14 bool sf[103];
15 int pos[103];
16 double ans[103];
17 int main()
18 {
19     //freopen("a.in","r",stdin);
20     ios::sync_with_stdio(false);
21     int n;
22     cin>>n;
23     for(int i=1;i<=n;++i)
24     for(int j=1;j<=n+1;++j)
25     cin>>a[i][j];
26     for(int s=1;s<=n;++s)
27     {
28         int mac=0,macc=-1e4-2333;//mac记录系数绝对值最大的行号,macc记录绝对值
29         for(int i=1;i<=n;++i)
30         if(!sf[i])//如果这一行没有被选过
31         {
32             if(abs(a[i][s])>macc)
33             {
34                 mac=i,
35                 macc=a[i][s];
36             }
37         }
38         if(abs(a[mac][s])<1e-7){cout<<"No Solution";return 0;}//绝对值最大的系数为0,则无解
39         double c=a[mac][s];//c为最大行第一个非零项的系数
40         pos[s]=mac;//第s个未知数的结果在第mac行
41         sf[mac]=1;//打个被选过的标记
42         for(int j=s;j<=n+1;++j)//先把最大行化简
43         {
44             a[mac][j]/=c;
45         }
46         for(int i=1;i<=n;++i)
47         if(i!=mac)
48         {
49             double c=a[i][s]/a[mac][s];
50             for(int j=s;j<=n+1;++j)
51             a[i][j]-=a[mac][j]*c;//把第i行的首项化到跟mac行一样,再减掉mac行的当前项
52         }
53         /*
54         for(int i=1;i<=n;++i)
55         {
56             for(int j=1;j<=n+1;++j)
57             cout<<a[i][j]<<" ";
58             cout<<endl;
59         }
60         cout<<endl;
61         */
62     }
63     for(int i=1;i<=n;++i)
64     ans[i]=a[pos[i]][n+1];//取解
65     for(int i=1;i<=n;++i)
66     printf("%.2f
",ans[i]);
67     return 0;
68 }

 (反正也不考裸题 难的又看不出来 不知道我写个什么玩意儿

原文地址:https://www.cnblogs.com/qwerta/p/9894048.html