归根结底,一切都归结为矩阵乘法 ——科学谚语
一、题目
1.题面
编辑
输入:
第一行两个数n,m;接下来n行m列描述一个矩阵A;接下来一行输入p;接下来m行p列描述一个矩阵B 。
输出:
输出矩阵A与矩阵B相乘所得的矩阵C。
样例输入
2 3
1 2 3
3 2 1
2
1 1
2 2
3 3
样例输出
14 14
10 10
数据范围限制:
编辑
提示:
编辑
2.题目大意
如题面。。。
二、思路
1.输入
此题输入十分简单,看题面就知道了,但相对繁琐,需要细心、耐心。程序如下:
for(int i=1;i<=n;i++) { for(int j=1;j<=p;j++) { int s=0; for(int k=1;k<=m;k++) { s=s+a[i][k]*b[k][j]; } c[i][j]=s; } }
2.主体程序
first.画图解困
根据题面,我们可以画出这样的一幅图(请放大查看)。
编辑
second.发现规律
我们可以发现,c[i][j]的数值是a数组的i行按照规则与b数组的j列相乘。
相乘规则:c[i][j]=a[i][k]*b[k][j]+a[i][k+1]*a[k+1][j]
third.代码实现
那么,只要用三重循环就可以了,前两重循环i和j,第三重循环k,结合公式进行就可以了!
代码如下:
for(int i=1;i<=n;i++) { for(int j=1;j<=p;j++) { int s=0; for(int k=1;k<=m;k++) { s=s+a[i][k]*b[k][j]; } c[i][j]=s; } }
3.输出
输出一个数组c。
for(int i=1;i<=n;i++) { for(int j=1;j<=p;j++) { cout<<c[i][j]<<" "; } cout<<endl; }
三、AC代码
#include<bits/stdc++.h> using namespace std; int a[105][105],b[105][105],c[105][105],n,m,p; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; } } cin>>p; for(int i=1;i<=m;i++) { for(int j=1;j<=p;j++) { cin>>b[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=p;j++) { int s=0; for(int k=1;k<=m;k++) { s=s+a[i][k]*b[k][j]; } c[i][j]=s; } } for(int i=1;i<=n;i++) { for(int j=1;j<=p;j++) { cout<<c[i][j]<<" "; } cout<<endl; } }
总结
这就是此题详解,欢迎关注!