蓝桥杯试题集试题总汇(C++)
问题描述
给定一个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
参考代码
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a[n][n],b[n][n],c[n][n];/*这里二维数组b存储一直存储二维数组,c[n][n]存储矩阵每次乘积的中间结果,
比如矩阵3次幂,a*b复制给c,然后a=c,a再和b相乘就是结果。*/
int i,j,k,z;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cin>>a[i][j];//输入矩阵
b[i][j]=a[i][j];
}
}
if(m==0)//注意矩阵的0次幂结果是单位矩阵
{
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(i==j)
cout<<1<<' ';
else
cout<<0<<' ';
}
cout<<endl;
}
}
else if(m==1)//矩阵的1次幂是其本身
{
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
else//当幂大于等于2时,可编写矩阵相乘代码
{
for(k=2; k<=m; k++)//k代表矩阵连乘了几次
{
for(i=0; i<n; i++)//这三层循环得出两个n阶矩阵的积
{
for(j=0; j<n; j++)
{
int v=0;
for(z=0; z<n; z++)
{
v=v+a[i][z]*b[z][j];//v储存每次矩阵相乘,对应位置的值
}
c[i][j]=v;//将值赋给c,这里说明一下,如果直接将v赋给a[i][j],对之后的a[i][z]*b[z][j]会有影响,应为a变了
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
a[i][j]=c[i][j];//让c[][]赋给a[][],再让a[][]*b[][]
}
}
}
for(i=0; i<n; i++)//最后输出a[][],当然也可以输出c[][],都是乘积后的结果
{
for(j=0; j<n; j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
return 0;
}
备注
注意矩阵0次幂和1次幂的结果。另外矩阵的乘法规则要了解。