蓝桥矩阵乘法

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

首先讲一下关于矩阵运算的一些方法:

1.当运算的幂为0时,也就是矩阵的0次幂,结果为单位矩阵。也就是矩阵对角线全为1,其余全为0

2.当运算的幂为1时,结果为矩阵本身,不加以运算。

3.矩阵的n次幂,可以通过分解计算得到,也就是n次幂=(n-1)次幂*1次幂循环求得结果

#include<stdio.h>
int main()
{
	int N,M,i,j,k,p,n=0;
	long long c[50][50],a[50][50],b[50][50];//如果相乘所得数特别大时要用到long类型,所以保险起见定义longlongint类型
	scanf("%d %d",&N,&M);//输入矩阵大小和幂数
	for(i=0;i<N;i++)//输入要计算的矩阵
	{
		for(j=0;j<N;j++)
		{
			scanf("%d",&a[i][j]);
			b[i][j]=a[i][j];//循环结束后a,b矩阵相等
		}
	}
	if(M<=1)//当M小于2时
	{
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			{
				if(M==0)//当M为0时输出单位矩阵
				{
					if(i==j)a[i][j]=1;
					else a[i][j]=0;
					printf("%d ",a[i][j]);
				}
				else printf("%d ",a[i][j]);//当M=1时输出矩阵本身
			}
			printf("\n");
		}
	}
	else //M大于等于2时求幂运算
	{
		for(p=0;p<M-1;p++)
		{
			for(i=0;i<N;i++)
			{
				for(j=0;j<N;j++)
				{
					for(k=0;k<N;k++)
					{
						n+=a[i][k]*b[k][j];
					}
					c[i][j]=n;//相乘结果存入C数组中
					n=0;//n置0,以方便保存新的乘积数
				}
				
			}
			for(i=0;i<N;i++)//输出或再处理矩阵
			{
				for(j=0;j<N;j++)
				{	
					if(p==M-2)printf("%lld ",c[i][j]);//如果运算结束则输出矩阵
					else b[i][j]=c[i][j];//运算未结束将数组c的值存入b中进行循环运算
				}
				if(p==M-2)printf("\n");

			}
		}
	}
	
	return 0;
}

谢谢大家的阅读和学习,如果觉得有帮助可以给个小赞哈~今后我会更加努力的,谢谢友友呀~

猜你喜欢

转载自blog.csdn.net/weixin_61936651/article/details/123739386