蓝桥杯-矩阵乘法

package jiChu;

import java.util.Scanner;

/**
 * 问题描述 给定一个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的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
 * 样例输入 2 2 1 2 3 4 样例输出 7 10 15 22
 * 
 * @author Vivinia
 *
 *         2018年1月25日
 */
public class JuMul {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();
		int M = input.nextInt();
		long a[][] = new long[N][N];        //原始数据
		long c[][] = new long[N][N];        //最终结果
		
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				c[i][j] = a[i][j] = input.nextInt();
		input.close();
		
		int temp = 1;           //M不等于1,进行循环
		while (M != temp && M != 0) {
			long b[][] = new long[N][N];       //暂时存储
			for (int i = 0; i < N; i++)
				for (int j = 0; j < N; j++)
					for (int k = 0; k < N; k++)
						b[i][j] += c[i][k] * a[k][j];

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++)
					c[i][j] = b[i][j];
			}
			temp++;         //幂的递增变量,幂数代表循环次数
		}
		
		if (M == 0) {       //M等于1,直接设置数据
			for (int i = 0; i < N; i++)
				for (int j = 0; j < N; j++)
					if (i == j)
						c[i][j] = 1;      //左上右下对角线为1
					else
						c[i][j] = 0;
		}

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++)
				System.out.print(c[i][j] + " ");
			System.out.println();
		}
	}

}


题意很不好理解,牵扯到了线代的内容,百度了一下矩阵的乘积,主要是这一段代码:

1.幂数不为1:

int temp = 1;           //M不等于1,进行循环
		while (M != temp && M != 0) {
			long b[][] = new long[N][N];       //暂时存储
			for (int i = 0; i < N; i++)
				for (int j = 0; j < N; j++)
					for (int k = 0; k < N; k++)
						b[i][j] += c[i][k] * a[k][j];

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++)
					c[i][j] = b[i][j];
			}
			temp++;         //幂的递增变量,幂数代表循环次数
		}


2.幂数为1:

if (M == 0) {       //M等于1,直接设置数据
			for (int i = 0; i < N; i++)
				for (int j = 0; j < N; j++)
					if (i == j)
						c[i][j] = 1;      //左上右下对角线为1
					else
						c[i][j] = 0;
		}


样例中结果7(1*1+2*3),10(1*2+2*4),15(1*3+3*4),22(2*3+4*4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值