[蓝桥杯][基础练习]矩阵乘法

时间限制: 1Sec 内存限制: 128MB

题目描述
给定一个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次幂,是单位矩阵,即正对角线上的值都为1,其他值为0;

   (2)方阵乘法:举个例子吧

     矩阵  1   2  乘  矩阵   1   2     等于  1x1+2x3   1x2+2x4    即    7    10
           3   4             3   4          3x1+4x3   3x2+4x4         15   22


就是第一个矩阵的第1行和第二个矩阵的第1列对应元素积的和作为结果矩阵的第一行的第一个值

第一个矩阵的第1行和第二个矩阵的第2列对应元素积的和作为结果矩阵的第一行的第二个值

第一个矩阵的第2行和第二个矩阵的第1列对应元素积的和作为结果矩阵的第二行的第一个值

第一个矩阵的第2行和第二个矩阵的第2列对应元素积的和作为结果矩阵的第二行的第二个值

还有不懂,看看线性代数课本,很基础的东西,如果有高中的萌新可以百度一下(搜索“矩阵乘法”)

这里其实用三个循环,三个数组就可以搞定,当然我们要注意当1次幂的时候的分开讨论

C语言代码:

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j, N,M,num[30][30],num1[30][30],t[30][30];
	scanf("%d %d",&N,&M);
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
		scanf("%d",&num[i][j]);
		num1[i][j]=num[i][j];
	    }
	}
     if(M==0)//零次幂 
     {
     	for(i=0;i<N;i++)
     	{
     		for(j=0;j<N;j++)
     		{
     		if(i==j)
     		num[i][j]=1;
     		else
     		num[i][j]=0;
     		printf("%d ",num[i][j]);
     	     }
     		printf("\n");
     	}
     }
     else
     {
	   for(int m=1;m<M;m++)// M-1次相乘 
    	{
		memset(t,0,sizeof(t));初始化t数组
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			{
				for(int p=0;p<N;p++)
				{
					t[i][j]+=(num1[i][p]*num[p][j]);//实现矩阵的乘法
				}
			}
		} 
	     for(i=0;i<N;i++)
       	{
	       for(j=0;j<N;j++)
	       num[i][j]=t[i][j];
    	}
	}
  for(i=0;i<N;i++)
  {
   for(j=0;j<N;j++)
   printf("%d ",num[i][j]);
    printf("\n");
  }
 }
	
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值