高斯消元法。直接附代码了,这个代码没有回带的。
1 //Writer : Hsz %WJMZBMR%tourist%hzwer
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<cmath>
6 #include<queue>
7 #include<map>
8 #include<set>
9 #include<stack>
10 #include<vector>
11 #include<cstdlib>
12 #include<algorithm>
13 #define LL long long
14 using namespace std;
15 int n,w[105];
16 const double eps=1e-8;
17 double a[105][105],b[105],v[105];
18 void gauss() {
19 for(int i=1; i<=n; i++) {//枚举每个方程,并记录每个该方程最大的系数
20 int p=0;
21 double mx=0;
22 for(int j=1; j<=n; j++)
23 if(fabs(a[i][j])-eps>mx) mx=fabs(a[i][j]),p=j;
24 if(!p) {
25 printf("No Solution");
26 return;
27 }
28 w[i]=p;
29 for(int j=1; j<=n; j++)
30 if(i!=j) {
31 double tt=a[j][p]/a[i][p];
32 for(int k=1; k<=n+1; k++)//记得把方程右边的结果也要消
33 a[j][k]-=a[i][k]*tt; //消元,消到这个方程的系数构成的矩阵每行只有一个为0,每列只有一个为0.
34 }
35 }
36 for(int i=1; i<=n; i++) v[w[i]]=a[i][n+1]/a[i][w[i]];//用v[]记录答案,w[]表示的是未消掉的那个元的位置。
37 for(int i=1; i<=n; i++) printf("%.2lf
" ,v[i]);
38 }
39 int main() {
40 cin>>n;
41 for(int i=1; i<=n; i++)
42 for(int j=1; j<=n+1; j++)
43 scanf("%lf",&a[i][j]);
44
45 gauss();
46 return 0;
47 }
upd:20200924 22时
再补一个,判断多解&无解的,但是我没试过,感觉对的
消元结束后,看每个方程系数不为0的项的数目,如果自由元的数目是0,而且等式右边不为0,无解;如果自由元的数目大于一,那么该方程组就有多解。
for(int i=1;i<=n;i++) {
int cnt=0;
for(int j=1;j<=n;j++) {
if(fabs(a[i][j])<eps) cnt++;
}
if(cnt==1) continue;
if(cnt>1) {printf("more
");return 0;}//多解
if(cnt==0&&fabs(a[i][n+1])>eps) {printf("no solution
");return 0;}//无解
}
不保证正确性,如果有错,欢迎指正。