试题 基础练习 矩阵乘法

一.题目

题目链接
  http://lx.lanqiao.cn/problem.page?gpid=T58
问题描述
  给定一个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

二.解决

思路:使用三个矩阵,c矩阵为结果矩阵,a矩阵为原矩阵,b矩阵为暂时存放当前计算数据的c矩阵。对于c[i][j]+=c[i][h]*c[h][j](h从1到n)

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 int a[35][35],b[35][35],c[35][35];//b矩阵初始为单位矩阵 
 8 int N,M;
 9 
10 void Myprint(int b[][35]){ //输出数组的值 
11     for(int i=1;i<=N;i++){
12         for(int j=1;j<=N;j++){
13             if(j!=N) cout<<b[i][j]<<" ";
14             else cout<<b[i][j]<<endl;
15         }
16     } 
17 }
18 void Fun(int b[][35],int c[][35]){ //将b数组的值赋给c数组 
19     for(int i=1;i<=N;i++){
20         for(int j=1;j<=N;j++){
21             c[i][j]=b[i][j];
22         }
23     }
24 }
25 int main(){
26     cin>>N>>M;
27     
28     for(int i=1;i<=N;i++){
29         for(int j=1;j<=N;j++){
30             cin>>a[i][j];
31             c[i][j]=a[i][j];//a数组与c数组为矩阵A 
32             if(i==j) b[i][j]=1;//b数组为单位矩阵 
33             else b[i][j]=0;
34         }
35     }
36     if(M==0) Myprint(b);//输出单位矩阵
37     else if(M==1) Myprint(a);
38     else{
39     for(int t=2;t<=M;t++){//M次方 
40         //注意:对于每次a矩阵与c矩阵的计算结果先由b数组存储,因为若用c数组存储,计算时会冗杂在一起,使得结果错误 
41         for(int i=1;i<=N;i++){
42             for(int j=1;j<=N;j++){
43                 for(int h=1;h<=N;h++){
44                     if(h==1) b[i][j]=c[i][h]*a[h][j];
45                     else b[i][j]+=c[i][h]*a[h][j];
46                 }
47             }
48         }
49         Fun(b,c);//把b数组的值赋给c数组 
50     }
51     Myprint(c);
52     } 
53     return 0; 
54 } 
 
 

猜你喜欢

转载自www.cnblogs.com/Aiahtwo/p/12729352.html