步骤
从r=c=0开始循环
1.找到当前列绝对值
最大的数所在行maxr,maxr行与当前r互换;
2.把r行整体除以a[r][c]倍(换句话说把a[r][c]变成1)
3.把下面的所有行的c列都变为0。
重复循环
代码
#include<iostream>
using namespace std;
#include<algorithm>
#include<cmath>
const int N=110;
double a[N][N];
bool isZero(double f){
if(fabs(f)<1e-8) return true;
return false;
}
int gauss(int n){
int c,r;
for(c=0,r=0;c<n;c++){//不能把r++放在里面,有跳过这一列但r不变的可能
int maxr=r;
for(int i=r+1;i<n;i++){
if(fabs(a[maxr][c])<fabs(a[i][c])) maxr=i;
}
if(isZero(a[maxr][c])) continue;//如果这一列最大的数是0,那么跳过这次循环 r保持不变
if(r!=maxr){
double t;
for(int i=c;i<n+1;i++){
t=a[r][i];
a[r][i]=a[maxr][i];
a[maxr][i]=t;
}
}
for(int i=n;i>=c;i--) a[r][i]/=a[r][c];//归一化 要倒着来 比如 3 6 6 9 从最后一个往前/3:1 2 2 3
for(int i=r+1;i<n;i++){
if(isZero(a[i][c])) continue;
for(int j=n;j>=c;j--){
a[i][j]-=a[i][c]*a[r][j];
}
}
r++;
}
if(r<n){
for(int i=r;i<n;i++){
if(!isZero(a[i][n])) return 2;//2代表无解
}
return 1;//1代表有无穷多解
}
--r;
for(int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
a[j][n]-=a[j][i]*a[i][n];
}
}
return 0;//0代表有唯一解
}
int main(void){
int n;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n+1;j++){
cin>>a[i][j];
}
}
int result= gauss(n);
if(result==0){
for(int i=0;i<n;i++){
printf("%.2lf\n",a[i][n]);
}
}else if(result==1) cout<<"Infinite group solutions";
else if(result==2) cout<<"No solution";
}