北京郵電大學複試機試(5)

題目描述
給定一個n*n的矩陣,求該矩陣的k次冪,即P^k。
輸入描述:

第一行:兩個整數n(2<=n<=10)、k(1<=k<=5),兩個數字之間用一個空格隔開,含義如上所示。
接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素Pij且(0<=Pij<=10)。另外,數據保證最後結果不會超過10^8。
輸出描述:
對於每組測試數據,輸出其結果。格式爲:
n行n列個整數,每行數之間用空格隔開,注意,每行最後一個數後面不應該有多餘的空格。
示例1
輸入
3 //這裏要說明一下 在提交的代碼裏 不應該有這項 它題目有問題,意思就是不用輸入這個3
2 2
9 8
9 3
3 3
4 8 4
9 3 0
3 5 7
5 2
4 0 3 0 1
0 0 5 8 5
8 9 8 5 3
9 6 1 7 8
7 2 5 7 3
輸出
153 96
108 81
1216 1248 708
1089 927 504
1161 1151 739
47 29 41 22 16
147 103 73 116 94
162 108 153 168 126
163 67 112 158 122
152 93 93 111 97

思路:
https://blog.csdn.net/puppylpg/article/details/45131527

import java.util.Scanner;

public class MatricQuickPower {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()){
            int n = input.nextInt();
            int k = input.nextInt();
            int array[][] = new int[n][n];
            for(int j=0;j < array.length;j ++){
                for(int m = 0;m < array[0].length;m ++){
                    array[j][m] = input.nextInt();
                }
            }
            int result[][] = mutiplyPower(array,k);
            for(int p=0;p < result.length;p ++){
                for(int q = 0;q < result[0].length; q++){
                    System.out.print(result[p][q] + " ");
                }
                System.out.println();
            }
        }
    }
    public static int[][] multiply(int a[][],int b[][]){
        //2x3 * 3x2 = 2x2
        int array[][] = new int[a.length][b[0].length];
        for(int i=0;i<a.length;i++){
            for(int j = 0;j < b[0].length;j ++){
                for(int k = 0;k < a[0].length;k ++){
                    array[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        return array;
    }
    public static int[][] mutiplyPower(int[][] a,int n){
        int result[][] = new int[a.length][a[0].length];
        //將result初始化爲單位陣
        for(int i=0;i < a.length;i ++){
            for(int j=0;j < a[0].length;j ++){
                if(i == j){
                    result[i][j] = 1;
                }
                else{
                    result[i][j] = 0;
                }
            }
        }
        while (n != 0){
            //&運算將n轉換爲二進制然後每一位 與 1 的二進制與 比如 3 & 1 爲 11 & 01 結果爲 1
            //這步操作 就是將n拆分爲二進制格式 詳情見上面的博客鏈接
            if((n&1) == 1){
                result = multiply(result,a);
            }
            //右移一位
            n = n>>1;
            a = multiply(a,a);
        }
        return result;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章