JAVA数据结构实现方阵的幂运算

    科技2024-10-30  14

    主函数类:只进行类之间的调用

    1.FangZhen类:调用类函数

    2.Define类:接收用户输入的方阵元素,以及方阵的阶数n,和需要运算的指数k

    3.Operation类:进行幂运算

    public class FangZhen {

    public static void main(String[] args) { System.out.println("FangZhen main函数执行."); //初始化定义方阵对象 Define define=new Define(); //调用Define类,define函数 define.define(); Operation operation=new Operation(); operation.operation(); }

    }

    2.Define类:接收用户输入的方阵元素,以及方阵的阶数n,和需要运算的指数k

    public class Define {

    private static int n;//方阵阶数 private static int k;//指数 private static int[][] a1 = new int[n+1][n+1]; public static void define() { System.out.println("Define类 define()执行"); //用户输入n,k System.out.println("请输入方阵的阶数n:"); Scanner s=new Scanner(System.in); n=s.nextInt();

    // System.out.println(“方阵的阶数n为:”+n);

    System.out.println("请输入方阵的指数k:"); Scanner s2=new Scanner(System.in); k=s2.nextInt();

    // System.out.println(“方阵的指数k为:”+k);

    //定义方阵 a1 = new int[n+1][n+1]; //输入方阵\ try { for(int i=1;i<=n;i++) { System.out.println("输入第"+(i)+"行的元素"); for(int j=1;j<=n;j++) { System.out.print("i="+i+",j="+j+": "); Scanner s1=new Scanner(System.in); a1[i][j]=s1.nextInt(); } } } catch (Exception e) { System.out.println("error"); } //输出方阵 System.out.println("您输入的是一个"+n+"阶方阵:"); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { System.out.print(" "+a1[i][j]); } System.out.println(); } } public int getN() { return n; } public void setN(int n) { this.n = n; } public int getK() { return k; } public void setK(int k) { this.k = k; } public int[][] getA1() { return a1; } public void setA1(int[][] a1) { this.a1 = a1; } @Override public String toString() { return "Define [n=" + n + ", k=" + k + ", a1=" + Arrays.toString(a1) + ", getN()=" + getN() + ", getK()=" + getK() + ", getA1()=" + Arrays.toString(getA1()) + "]"; }

    }

    3.Operation类:进行幂运算

    //运算类,对方阵进行幂运算 //注释掉的相似代码为下标从00开始存储 //现在使用的是从11开始存储,却浪费了存储空间 public class Operation {

    private static int n; private static int k; private static int[][] a1 ; private static int[][] a2 = new int[n+1][n+1]; private static int[][] a3 = new int[n+1][n+1]; public void operation() {

    // System.out.println(“Operation类 operation()执行”); Define define=new Define(); n=define.getN(); k=define.getK(); a1=define.getA1(); // System.out.println(“n:”+n+" k:"+k+" a1[][]:"+a1);

    //a2存储相乘后的方阵 a2=new int[n+1][n+1]; //a3存储指数大于2的方阵 a3=new int[n+1][n+1]; //开始对方阵进行幂运算 电脑下标 | 数学逻辑 /* a[0][0] a[0][1] a[0][2] | a[1][1] a[1][2] a[1][3] * a[1][0] a[1][1] a[1][2] | a[2][1] a[2][2] a[2][3] * a[2][0] a[2][1] a[2][2] | a[3][1] a[3][2] a[3][3] */ //指数为2只参加下列for循环,不进入while(指数3次及以上循环)

    // for(int r=1;r<=n;r++) {//外层循环i控制数组行数 // int j=-1;//控制相乘后的存储列表下标数 // int count=0;//每一行进行相乘求和的次数 // while(count!=n) { // int sum=0;//存储每一行×每一列的和 // for(int i=1 ; i<=n ;i++) { // sum+=a1[r][i]*a1[i][r]; // if((i+1)>(n)) { // j++; // a2[r][j]=sum; // } // } // count++; // } // } for(int i=1;i<=n;i++) {

    int z=0; while(z!=n) { int sum=0; for(int j=1;j<=n;j++) { sum+=a1[i][j]*a1[j][i]; if(j==n) { z++;

    // System.out.print(“sum:”+sum);System.out.println(); a2[i][z]=sum; } } } } //输出矩阵a2 System.out.println(“矩阵的2次方:”); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { System.out.print(" "+a2[i][j]); } System.out.println(); } System.out.println(); //--------------------------------------------------------------------------- //目标:a3存储a2*a1指数大于3方阵和,并赋值给a2 //a1存储初始方阵 , a2 存储 每次幂结果(由a3最终结果数组赋值) int k1=k; while(k1!=2) {

    for(int i=1;i<=n;i++) { int z=0; while(z!=n) { int sum=0; for(int j=1;j<=n;j++) { sum+=a2[i][j]*a1[j][i];

    // System.out.print(a2[i][j]+"*"+a1[j][i]);System.out.println(); if(j==n) { z++; // System.out.print(“sum:”+sum);System.out.println(“赋给下标:”+i+z); a3[i][z]=sum; } } } } k1–;//控制循环次数 //不使用指针将a3赋给a2,使用for循环赋值 System.out.println(""); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a2[i][j]=a3[i][j]; } }

    //输出矩阵 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { System.out.print(" "+a3[i][j]); } System.out.println(); }

    // for(int r=0;r<n;r++) {//外层循环i控制数组行数 // // int j=-1;//控制相乘后的存储列表下标数 // int count=0;//每一行进行相乘求和的次数 // // while(count!=n) { // int sum=0;//存储每一行×每一列的和 // // for(int i=0 ; i<n ;i++) { // // sum+=a2[r][i]a1[i][r]; // System.out.print(r+","+i+":"+a2[r][i]+""+i+","+r+":"+a1[i][r]+" “); // if((i+1)==(n)) { // j++; // a3[r][j]=sum; // System.out.println(sum+“赋给了”+r+”,"+j+" "); // } // } // count++; // } // }

    }//while

    //--------------------------------------------------------------------

    }

    }

    总结

    Operation类中注释掉的相似代码为下标从00开始存储(有点没绕过弯来,不打算写了) 现在使用的是从下标11开始存储,却浪费了存储空间 将关键变量设置为成员变量,方便封装进行类之间调用

    Processed: 0.017, SQL: 8