蓝桥杯试题 基础练习 矩阵乘法( 详解 )

资源限制

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

问题描述

  给定一个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

 思路:

矩阵乘积:差不多意思是:

举个栗子:当n=2;

第一个数,是第一横行的数和第一竖行的数,对应相乘,相加得到的。

和第一个数同一行的第二个数,也是第一横行和第二竖行的数对应相乘,相加得到。

第三个数,和前两个数不在同一行上,因为是第一行的数把所有可以计算的竖行轮完了。所以开始第二横行和第一竖行计算,再和第二竖行计算。直到这一横行也计算完。

百度的图是这样的:(参考)

A的阶数,这个的意思是:

0阶的时候:对角线为1.其他位置为0

1阶的时候:为本身

2阶的时候:就按上面写的。

3阶:2阶算出来的数和1阶来计算矩阵乘积

4阶:3阶结果和1阶计算

.......

所以大致思想我们懂了,就开始代码模拟一下吧(*^▽^*)


 实现代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	int i,j,k,z;
	int a[35][35],b[35][35],c[35][35];
	
	cin>>n>>m;
	
	
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			cin>>a[i][j];//输入 
			b[i][j]=a[i][j];
			c[i][j]=0;//初始化 
		}
	}
	
	if(m==0)
	{
		for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
		     if(i==j)
			 b[i][j]=1;
			 else
			 b[i][j]=0; 
		}
	}
	}
	else if(m==1)
	{
		for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			b[i][j]=a[i][j]; 
		}
	}
	}
	else if(m>=2)
	{
		for(z=2;z<=m;z++)
		{
			for(i=1;i<=n;i++)//横行 
	        {
		        for(j=1;j<=n;j++)//竖行 
		        {
			        for(k=1;k<=n;k++)//第几个数 
			        {
				        c[i][j]+=a[i][k]*b[k][j];
		            }
		        }
	        }
	        
	        for(i=1;i<=n;i++)
	        {
	        	for(j=1;j<=n;j++)
	        	{
	        		b[i][j]=c[i][j];
	        		c[i][j]=0;
	        		
				}
			}
		}

	}
	
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%d ",b[i][j]);
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/with_wine/article/details/115279621