Gauss消元
给定一个线性方程组,对其求解
输入格式:
第一行,一个正整数 nn
第二至 n+1n+1行,每行 n+1n+1 个整数,为,代表一组方程。
输出格式:
共n行,每行一个数,第 ii行为(保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".
输入样例#1:
3
1 3 4 5
1 4 7 3
9 3 2 2
输出样例#1:
-0.97
5.18
-2.39
本来想深入的研究一下矩阵来着,,
结果不知道怎么着的研究到高斯消元上了,。。。。
高斯消元法真是一个神(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 }
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有