#include<iostream>
#include<algorithm>
#include<cstring>
const int N=102;
using namespace std;
double a[N][N];
void merge(double a[N][N],int n){
int flag=0; //是否有为唯一解
for(int i=1;i<=n;i++){ //一列一列消元,遍历每一列,第n+1列不用
int max_row=i; //暂定每一列的最大数出现在(i,i)所在的这一行,上面的行不用看了。
for(int j=i+1;j<=n;j++){ //遍历第i+1--n行 寻找这些行中 第i个位置的数有没有比第i行的大
if(fabs(a[j][i]>fabs(a[max_row][i]))){
max_row=j;
}
}
if(max_row!=i){ //如果不是暂定的哪一行,将最大数所在的那一行调到第i行
for(int j=1;j<=n+1;j++){
swap(a[i][j],a[max_row][j]);
}
}
for(int j=i+1;j<=n;j++){ //对i+1行下面的做初等行运算
double bei=a[j][i]/a[i][i]; //倍数等于(j,i)/(i,i) 保证了最大的除数不为0
for(int k=i;k<=n+1;k++){ //遍历每一列
a[j][k] -= a[i][k]*bei; //第j行的每一个数都减去 第i行每个数的bei倍
}
}
printf("第%d列变换后\n",i);
for(int j=1;j<=n;j++){
for(int k=1;k<=n+1;k++){
printf("%.2f ",a[j][k]);
}
printf("\n");
}
printf("\n");
}
for(int i=n;i>=1;i--){ //从末行开始
for(int j=i+1;j<=n;j++){ //每一行的i+1到n位。i+1位不考虑因为前面都是0
a[i][n+1] -= a[i][j]*a[j][n+1]; //减去每一位上的数值*本未知现已知的X
}
if(a[i][i]==0){
flag=1;
}
else{
a[i][n+1] /= a[i][i]; //第i行可求的未知数X的系数在第(i,i)这个位置上
}
}
if(flag==1){
cout<<("No Solution\n");
}
else{
for(int i=1;i<=n;i++){
printf("X%d = %5.2f\n",i,a[i][n+1]);
}
}
}
int main() {
int n;
memset(a,0,sizeof(a));
cout<<("请输入n : ");
cin>>n;
cout<<("请输入 n * (n+1)的矩阵:\n");
for(int i=1;i<=n;i++){ //n行
for(int j=1;j<=n+1;j++){ //n+1列,n个未知数方程式,还有一列值
cin>>a[i][j];
}
}
merge(a,n); //高斯消元法处理n个未知数的矩阵a
return 0;
}
代码实现: