#include<iostream>#include<algorithm>#include<cmath>usingnamespace std;constint N =110;constdouble eps =1e-8;int n;double a[N][N];//增广矩阵intgauss(){int r, c;//行row,列colfor(r =0, c =0; c < n;++c){//遍历每一列-》每一列主元化为1int t = r;//从每一行开始(主元所在行),t 存储绝对值最大的行for(int i = r; i < n;++i){if(fabs(a[i][c])>fabs(a[t][c])){
t = i;}}if(fabs(a[t][c])<eps)continue;// 如果最大的值就是0,那么其他的值也是0,直接continuefor(int i = c; i <= n;++i)swap(a[t][i], a[r][i]);//最大值的行,移到第r行for(int i = n; i >= c;--i) a[r][i]/= a[r][c];// 将主元变为1,这里倒着除,不然正着的话,一直都是除1for(int i = r +1; i < n;++i){// 将第r行主元下面的数,变为0if(fabs(a[i][c])> eps){//非0for(int j = n; j >= c;--j){
a[i][j]-= a[r][j]* a[i][c];// 从后往前,当前行的每个数字,都减去对应列 * 行首非0的数字,这样就能保证第一个数字是 a[i][0] -= 1*a[i][0];}}}
r++;//换下一行}if(r < n){// 说明剩下方程的个数是小于 n 的,说明不是唯一解,判断是无解还是无穷多解// 因为已经是阶梯型,所以 r ~ n-1 的值应该都为 0for(int i = r; i < n; i ++)// if(fabs(a[i][n])> eps)// a[i][n] 代表 b_i ,即 左边=0,右边=b_i,0 != b_i, 所以无解。return2;return1;// 否则, 0 = 0,就是r ~ n-1的方程都是多余方程}// 回溯计算每个值xi// 唯一解 ↓,从下往上回代,得到方程的解for(int i = n -1; i >=0; i --)for(int j = i +1; j < n; j ++)
a[i][n]-= a[j][n]* a[i][j];//因为只要得到解,所以只用对 b_i 进行操作,中间的值,可以不用操作,因为不用输出return0;}intmain(){
cin >> n;for(int i =0; i < n; i ++)for(int j =0; j < n +1; j ++)
cin >> a[i][j];int t =gauss();if(t ==0){for(int i =0; i < n; i ++){if(fabs(a[i][n])< eps) a[i][n]=0;// 解可能出现-0.00情况,应该是只有0.00;小于eps可以看作为0,但可能为+0或-0,但只有一个0,所以统一赋值为0/或直接输出0printf("%.2lf\n", a[i][n]);}}elseif(t ==1)puts("Infinite group solutions");elseputs("No solution");return0;}
#include<iostream>#include<algorithm>#include<cmath>usingnamespace std;constint N =110;constdouble eps =1e-8;int n;int a[N][N];//增广矩阵intgauss(){int r, c;//行row,列colfor(r =0, c =0; c < n;++c){int t = r;for(int i = r; i < n;++i){if((a[i][c])){
t = i;}}if((a[t][c])==0)continue;for(int i = c; i <= n;++i)swap(a[t][i], a[r][i]);for(int i = n; i >= c;--i) a[r][i]/= a[r][c];for(int i = r +1; i < n;++i){if((a[i][c])){for(int j = n; j >= c;--j){
a[i][j]^= a[r][j];}}}
r++;}if(r < n){for(int i = r; i < n; i ++)if((a[i][n]))return2;return1;}for(int i = n -1; i >=0; i --)for(int j = i +1; j < n; j ++)
a[i][n]^= a[j][n]* a[i][j];return0;}intmain(){
cin >> n;for(int i =0; i < n; i ++)for(int j =0; j < n +1; j ++)
cin >> a[i][j];int t =gauss();if(t ==0){for(int i =0; i < n; i ++){printf("%d\n", a[i][n]);}}elseif(t ==1)puts("Multiple sets of solutions");elseputs("No solution");return0;}