给定一个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;
}
谢谢大家的阅读和学习,如果觉得有帮助可以给个小赞哈~今后我会更加努力的,谢谢友友呀~