#include<bits/stdc++.h>
using namespace std;constint N =505;constint M =1005;constdouble esp =1e-6;double a[N][M];int n, m;intgauss(){//千万注意:所有判断精度的地方 fabs()不要忘记否则会出现错误int c, r;for(c =1, r =1; c <= m; c ++){int t = r;for(int i = r +1; i <= n; i ++)//找到最大行{if(fabs(a[i][c])>fabs(a[t][c]))
t = i;}if(fabs(a[t][c])< esp)continue;//如果最大行为 0 则不用计算for(int i = c; i <= m +1; i ++)swap(a[t][i], a[r][i]);//交换最大行for(int i = m +1; i >= c; i --) a[r][i]/= a[r][c];//把第 c 列的值变为 1for(int i = r +1; i <= n; i ++)//第 r 行下面的行中的第 c 列也变成 0{if(fabs(a[i][c])> esp){for(int j = m +1; j >= c; j --){
a[i][j]-= a[r][j]* a[i][c];}}}
r ++;}if(r <= n)//这里必须是 <= 号,因为 r 是后缀++{for(int i = r; i <= n; i ++){if(fabs(a[i][m +1])> esp)//出现 (0 == 非0)情况,则无解{return2;//无解}}return1;//无穷解 有些行的出现(0 == 0)的情况, 则含有自由变量,怎有无数解}for(int i = n; i >=1; i --)//求解唯一解的过程{for(int j = i +1; j <= m; j ++){
a[i][m +1]-= a[i][j]* a[j][m +1];}}return0;//有唯一解}intmain(){scanf("%d",&n);//n行,m+1列, 第 m+1 列为当前行的方程的解
m = n;for(int i =1; i <= n; i ++)for(int j =1; j <= m +1; j ++)scanf("%lf",&a[i][j]);int f =gauss();if(f ==0){for(int i =1; i <= n; i ++){printf("%.2f\n", a[i][m +1]);}}elseif(f ==1){printf("Many solutions\n");}elseif(f ==2){printf("No solutions\n");}return0;}
标志模板题目链接#include <bits/stdc++.h>using namespace std;const int N = 505;const int M = 1005;const double esp = 1e-6;double a[N][M];int n, m;int gauss(){ //千万注意:所有判断精度的地方 fabs()不要忘记否则会出现错误 int c, r; for (c = 1, r = 1; c <= m; c