时间限制: 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;
}