java 实现高斯消元_AcWing 883. 高斯消元解线性方程组(java)

import java.util.*;

//java中的Math.abs()可以用于浮点数取绝对值

//String.format("%.2f",x) %.2f"为保留两位小数,x为要输出的数字

class Main{

static int N=110;

static double[][] a=new double[N][N+1];

static int n=0;

static double eps=0.000001;

public static int guass(double[][] a){

int row,col;

//遍历每一列

for(row=0,col=0;col

int t=row;

//找一列中的最大值

for(int i=row;i

if(Math.abs(a[i][col])>Math.abs(a[t][col])){

t=i;

}

}

//如果找出的最大值为0,继续下一列寻找非0的最大值

if(Math.abs(a[t][col])

//交换

for(int i=col;i<=n;i++){

double temp=a[t][i];

a[t][i]=a[row][i];

a[row][i]=temp;

}

//将当前的非0第一位数置为1,构造阶梯矩阵的斜边

//这里要注意从后往前去更新数据,因为这里变化是根据第一个数变化的,要保持它的数据最后变化或者找个数存一下

for(int i=n;i>=col;i--){

a[row][i]/=a[row][col];

}

//下面一步就是用上面那一行来更新下面的所有行,同样要注意从后往前更新数据

//注意只需要对首位非0的行进行更新就行

for(int i=row+1;i

if(Math.abs(a[i][col])>eps) {

for(int j=n;j>=col;j--){

a[i][j]-=a[row][j]*a[i][col];

}

}

}

//进行下一行的处理

row++;

}

//0解或者无穷解

if(row

//阶梯状,更新不了下面的说明往下的都是0;判断下面每一行的最后结果,如果不是0,说明无解

for(int i=row;i

if(Math.abs(a[i][n])>eps)return 2;

}

return 1;

}

//处理唯一解,从下往上得出解

for(int i=n-1;i>=0;i--){

for(int j=i+1;j

a[i][n]-=a[j][n]*a[i][j];//a[j][n]这里的横坐标为j是因为需要从这一行往下清空干净,可以举个3*4的例子

}

}

//唯一解

return 0;

}

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

n=sc.nextInt();

for(int i=0;i

for(int j=0;j<=n;j++){

a[i][j]=sc.nextDouble();

}

}

int t=guass(a);

if(t==0){

for(int i=0;i

System.out.println(String.format("%.2f",a[i][n]));

}

}

else if(t==1){

System.out.println("Infinite group solutions");

}else{

System.out.println("No solution");

}

}

}

你可能感兴趣的:(java,实现高斯消元)