蓝桥杯BASIC-17 矩阵乘法

问题描述

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

矩阵乘法,每一个元素分别是对应行和列的乘积相加和
模拟一下计算过程可以发现,一次乘法的运算至少需要3个独立矩阵,也就是三个独立的数组,两个保存因子的矩阵,一个保存结果的矩阵,所以创建三个数组,其中两个作为乘法因子,一个作为运算结果。

对于幂m,总共运算了m-1次乘法

注意幂为0的特殊情况。

本题暂无特殊解法

#include 
#include 
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	if(n == 1)
	{
		cin >> n;
		cout << pow(n,m);
		return 0;
	}
	if(m == 0)
	{
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if(i == j)
				{
					cout << 1 << " ";
				}
				else
				{
					cout << 0 << " ";
				}
			}
			cout << endl;
		}
		return 0;
	}
	int matrix1[n][n];
	int matrix2[n][n];
	int answer[n][n];
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cin >> matrix1[i][j];
			answer[i][j] = matrix2[i][j] = matrix1[i][j];
		}
	}
	while(--m)
	{
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				int temp = 0;
				//cout << i << " " << j << " = ";
				for(int a = 0; a < n; a++)
				{
					temp += matrix2[i][a] * matrix1[a][j];
					//cout << matrix2[i][a] << "*" << matrix1[a][j] << " ";
					
				}
				//cout << endl;
				answer[i][j] = temp;
			}
		}
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{	
				matrix2[i][j] = answer[i][j];
			}
		}
		
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cout << answer[i][j] << " ";
		}
		cout << endl;
	}
	
	return 0;
}

你可能感兴趣的:(蓝桥杯)