蓝桥训练系统 矩阵乘法

问题描述

  给定一个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 #include<stdio.h>
 2 int a[35][35],b[35][35],c[35][35]; 
 3  int  main()
 4  {
 5      int N,M,i;
 6      scanf("%d%d",&N,&M);
 7      
 8      
 9          for(i=0;i<N;i++)
10      {
11          for(int j=0;j<N;j++)
12          scanf("%d",&a[i][j]);
13      }
14      
15      
16      for(int i=0;i<N;i++)
17      {
18          for(int j=0;j<N;j++)
19              b[i][j]=a[i][j];
20      }
21  
22      
23     if(M==0)
24     {
25         for(i=0;i<N;i++)
26          c[i][i]=1;//单位矩阵主对角线的所有值为一; 
27     }
28     else if(M==1)
29     {
30             for(int x=0;x<N;x++)
31         {
32             for(int y=0;y<N;y++)
33              c[x][y]=b[x][y];
34         }
35     }
36     else if(M>=2)
37     {
38        for(int k=0;k<M;k++)//本身下来一次就可以充当一次幂了;在下来一次就是二次; 
39         {
40             for(int x=0;x<N;x++)
41             {
42                 for(int y=0;y<N;y++)
43                 {
44                         c[x][y]=b[x][y];
45                         b[x][y]=0;
46                 }    
47             }
48                for(int i=0;i<N;i++)
49             {    
50                 for(int j=0;j<N;j++)
51                 {   
52                     for(int t=0;t<N;t++)
53                     {
54                         b[i][j]+=a[i][t]*c[t][j];//前一次矩阵乘法之后与原矩阵的乘法,需要中间数组b来当作桥梁 ,不能直接用a因为会改变原输入数组的值; 
55                     }
56                 }
57             }
58         }
59     }
60     
61      for(int i=0;i<N;i++)
62     {
63         for(int j=0;j<N;j++)
64         {
65             printf("%d ",c[i][j]);
66         }
67         printf("\n");
68     }
69 
70      
71 return 0;
72  }

猜你喜欢

转载自www.cnblogs.com/yuanqingwen/p/10498402.html