矩阵乘法

来源:互联网 发布:mina 接收数据不完整 编辑:程序博客网 时间:2024/05/22 15:07

矩阵乘法

时间限制:1.0s   内存限制:512.0MB

问题描述:给定一个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 <stdio.h>#include <stdlib.h>void calende();int line,mi;int jc[30][30]={0};int jce[30][30]={0};int jcen[30][30]={0};int main(){int i,j;scanf("%d %d",&line,&mi);for(i=0;i<line;i++){for(j=0;j<line;j++){scanf("%d",&jc[i][j]);jce[i][j]=jc[i][j];}}if(mi==0)for(i=0;i<line;i++){jcen[i][i]=1;}calende();return 0;}void calende(){int i,j,z,d; for(i=2;i<=mi;i++)//幂 {for(j=0;j<line;j++)//遍历行 {for(z=0;z<line;z++)//遍历列 {for(d=0;d<line;d++){jcen[j][z]+=jce[j][d]*jc[d][z];}}}if(i==mi)break;for(j=0;j<line;j++)//遍历行 {for(z=0;z<line;z++)//遍历列 {    jce[j][z]=jcen[j][z];    jcen[j][z]=0;}} }if(mi==1||mi==0){ for(j=0;j<line;j++)//遍历行   {for(z=0;z<line;z++)//遍历列 {if(mi==1)   printf("%d ",jc[j][z]);       else    printf("%d ",jcen[j][z]);}printf("\n");}}else{for(j=0;j<line;j++)//遍历行 {for(z=0;z<line;z++)//遍历列 {    jce[j][z]=jcen[j][z];    jcen[j][z]=0;printf("%d ",jce[j][z]);}printf("\n");}}}



#include <iostream>using namespace std;void calende();void show();void getinfo(int **);void getinfo1(int **);void cleanms(int **);void cleanms1(int **);int line,mi;int **jc=NULL;int **jce=NULL;int **jcen=NULL;int main(){int i,j;cin>>line>>mi;getinfo1(jc);getinfo1(jce);getinfo1(jcen);for(i=0;i<line;i++){for(j=0;j<line;j++){cin>>jc[i][j];}}for (int z = 0; z < line; z++) {     jce[z][z] = 1;  }    calende();show();cleanms1(jc);cleanms1(jce);cleanms1(jcen);return 0;}void calende(){     for (int i = 0; i < mi; i++) {                   for (int j = 0; j < line; j++) {              for (int j2 = 0; j2 < line; j2++) {                  for (int k = 0; k < line; k++) {                      jcen[j][j2] += jce[j][k] * jc[k][j2];                  }              }          }          for (int j = 0; j < line; j++){              for (int j2 = 0; j2 < line; j2++) {                  jce[j][j2] = jcen[j][j2]; jcen[j][j2]=0;             }          }      }   }void show(){for (int i = 0; i < line; i++) {          for (int j = 0; j < line; j++) {              cout<<jce[i][j]<<" ";          } cout<<endl; } }void getinfo(int **p)//内存不连续 {p=new int*[line];for(int i=0;i<line;i++){p[i]=new int[line];}} void getinfo1(int **a)//保证内存的连续性 {a = new int* [line];a[0] = new int[line * line]; for(int i=1; i<line; i++){   a[i] = a[i-1] + line; }}void cleanms(int **p){for(int i=0; i<line; i++)delete[] p[i];delete[] p;} void cleanms1(int **a){delete[] a[0];delete[] a;}


(全文完)

0 0