Java 蓝桥杯 矩阵乘法

题目描述

给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22

输入
输入描述:
  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输入样例:
2 2
1 2
3 4

输出

输出描述:
  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
输出样例:
7 10
15 22

HINT:时间限制:1.0s 内存限制:512.0MB

解题思路

主要就是搞懂矩阵的乘法就行, 就是用第一个矩阵的行来依次乘以第二个矩阵的列然后再相加就得到了新矩阵的一个元素,之后就是循环行的运算了,还有就是要考虑幂的次数是0次和1次的时候
在这里插

代码

import java.util.Scanner;

public class Main {
    
    

    public static void main(String[] args) {
    
    
        Scanner scanner=new Scanner(System.in);
        int m=scanner.nextInt();//接收矩阵的阶数和幂数
        int n=scanner.nextInt();
        long [][] p=new long[m][m];//定义二阶数组来接收矩阵
        long [][] q=new long[m][m];
        for (int i=0;i<m;i++){
    
    //输入矩阵的数
            for (int j=0;j<m;j++){
    
    
                q[i][j]=p[i][j]=scanner.nextLong();
            }
        }
        if (n==0){
    
    //若为0阶的话 主对角线为1 其余的都为0
            for (int i=0;i<m;i++){
    
    
                for (int j=0;j<m;j++){
    
    
                    if (i==j){
    
    
                        System.out.print(1+" ");
                    }else {
    
    
                        System.out.print(0+" ");
                    }
                }
                System.out.println();
            }
        }
        else if (n==1){
    
    //若为1阶就输出原矩阵就行
            for (int i=0;i<m;i++){
    
    
                for (int j=0;j<m;j++){
    
    
                    System.out.print(p[i][j]+" ");
                }
                System.out.println();
            }
        }
        else {
    
    //若阶数大于1
            for (int x=1;x<n;x++){
    
    
                long [][] num=new long[m][m];//定义一个新的二阶数组来当作中转矩阵
                for (int i=0;i<m;i++){
    
    
                    for (int j=0;j<m;j++){
    
    //一行一行的算
                        long y=0;//定义一个值来接收计算后的数值  因为矩阵的乘法是第一个矩阵的行乘以第二个矩阵的列的和 得到一个值
                        for (int k=0;k<m;k++){
    
    
                            y+=p[i][k]*q[k][j];
                        }
                        num[i][j]=y;//放入中转数组
                    }
                }
                q=num;//结束之后再替换
            }
            for (int i=0;i<m;i++){
    
    //输出最后的值
                for (int j=0;j<m;j++){
    
    
                    System.out.print(q[i][j]+" ");
                }
                System.out.println();
            }
        }
    }
}

流程图

Created with Raphaël 2.3.0 开始 输入矩阵的阶数和幂数m,n 定义两个二维矩阵p和q i<m j<m 输入原始矩阵 n==0 输出m阶的单位矩阵 结束 n==1 输出原始矩阵 n>1 x<n i<m j<m k<m 计算每个位置的数值 放入中转矩阵中 k++ j++ i++ 将中转矩阵转换为q矩阵 输出最后的值 yes no yes no yes no yes no yes yes no yes no yes no yes no

猜你喜欢

转载自blog.csdn.net/joreng/article/details/121613047