您的位置:首页 > 其它

(蓝桥杯)基础练习 矩阵乘法

2018-03-02 20:42 471 查看
问题描述  给定一个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

要做出这道题,首先了解下矩阵乘积是个啥



知道了矩阵乘积是什么之后,就比较好办了,然后在数组中我们找下与数组下标的关系



最最重要的是我们还需要知道矩阵的0次幂是个单位矩阵,就是正对角线全是1,其余全是0,具体为啥我也还不清楚,线性代数掌握后再来解释下。
从上面写出来的可以看出我们用三个循环就可以解决矩阵乘积了
然后上代码

#include<iostream>
#include<cstdio>

using namespace std;

void print(int c[][101],int n)//输出矩阵
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<c[i][j]<<" ";
}
cout<<endl;
}
}

void matrix(int a[][101],int b[][101],int c[][101],int n,int m)
{
for(int p=1;p<m;p++){//m次幂
for(int i=0;i<n;i++){//三重循环
for(int j=0;j<n;j++){
int t=0;
for(int k=0;k<n;k++){
t+=a[i][k]*b[k][j];
c[i][j]=t;
}
}
}
for(int i=0;i<n;i++){//把c[i][j]再赋值给b[i][j]
for(int j=0;j<n;j++){
b[i][j]=c[i][j];
}
}
}
}

int main()
{
int n,m;
int a[101][101]={0},b[101][101]={0},c[101][101]={0};
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[i][j];
}
}
if(m==0){//矩阵的0次幂为单位矩阵,我还不知道为什么
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
c[i][j]=1;
}
}
}
print(c,n);
}else if(m==1){
print(a,n);
}else{
matrix(a,b,c,n,m);
print(c,n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: