归根结底,一切都归结为矩阵乘法 ——科学谚语
一、题目
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;
}
}
总结
这就是此题详解,欢迎关注!