2022-01-13

65 阅读1分钟
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];
    static int n=0;
    static double eps=0.000001;
    public static int guass(double[][] a){
       int row,col;
       //遍历每一列
        for(row=0,col=0;col<n;col++){
            int t=row;
            //找一列中的最大值
            for(int i=row;i<n;i++){
                if(Math.abs(a[i][col])>Math.abs(a[t][col])){
                    t=i;
                }
            }
            //如果找出的最大值为0,继续下一列寻找非0的最大值
            if(Math.abs(a[t][col])<eps)continue;
            //交换
            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<n;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<n){
            //阶梯状,更新不了下面的说明往下的都是0;判断下面每一行的最后结果,如果不是0,说明无解
            for(int i=row;i<n;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<n;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<n;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<n;i++){
              if(Math.abs(a[i][n]) < eps){
                  System.out.printf("%.2f\n",Math.abs(a[i][n]));
              }else{
                  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");
         }
    }
}