解题思路: 每次都只计算目标矩阵的一个位置:a[i][j] = c[k][1]*b[k][j] (K的范围为 1 到 M,我这里矩阵的0号位置不用)
由于我们的M可能大于,我采用的是逐步上升的求法,先求M=2,再在这基础上继续求
注意事项: 要特别注意的就只当M=0时,矩阵是一个单位矩阵(对角线为1,其余为0),
再求M=3的时候其实是将M=2的乘以M=1的,所以我们需要保存刚开始输入的M=1的矩阵。
代码分解:
(1)定义的第一个函数:求某个位置幂上升一次的值
int add(int i,int j,int a[31][31],int b[31][31],int N){ //就是求你要的i行j列这个位置的“幂再上升一次”的值 int c=0; for (int k=1;k<=N;k++){ c+=a[i][k]*b[k][j]; } return c; }
(2)矩阵复制函数:因为我们这里有两处需要保留原来的矩阵
void cove(int c[31][31],int a[31][31],int N){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ c[i][j]=a[i][j]; } } }
(3)主函数:
int main() { int a[31][31],b[31][31],c[31][31]; int N,M; cin>>N>>M; for(int i=1;i<=N;i++){ for(int j=1;j>a[i][j]; } } cove(b,a,N);//用矩阵b保留我们刚开始的矩阵a,在我们M>2的情况下需要使用 int k=2; while(k<=M){ if(k==2){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,b,b,N); } } } else { cove(c,a,N); // 重点,为什么需要这一步,为什么下面不直接a[i][j]=add(i,j,a,b,N)。 //因为在下面的两个for循环下矩阵a正在逐渐改变,所以我们需要保留原来的 for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,c,b,N); } } } k++; }
完整参考代码:
#include<iostream> using namespace std; int add(int i,int j,int a[31][31],int b[31][31],int N){ int c=0; for (int k=1;k<=N;k++){ c+=a[i][k]*b[k][j]; } return c; } void cove(int c[31][31],int a[31][31],int N){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ c[i][j]=a[i][j]; } } } int main() { int a[31][31],b[31][31],c[31][31]; int N,M; cin>>N>>M; for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cin>>a[i][j]; } } cove(b,a,N); int k=2; while(k<=M){ if(k==2){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,b,b,N); } } } else{ cove(c,a,N); for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,c,b,N); } } } k++; } if(M){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cout<<a[i][j]<<" "; if(j==N) cout<<endl; } } } if(!M) { for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ if(i==j) cout<<1<<" "; if(i!=j) cout<<0<<" "; if(j==N) cout<<endl; } } } return 0; }
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:696 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:644 |
小明A+B (C语言代码)浏览:1316 |
最小公倍数 (C语言代码)浏览:894 |
淘淘的名单 (C语言代码)浏览:1167 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:616 |
三角形 (C语言代码)浏览:965 |
DNA (C语言代码)浏览:564 |
P1000 (C语言代码)浏览:911 |
C二级辅导-计负均正 (C语言代码)浏览:523 |