A*B Problem II
时间限制:1000 ms | 内存限制:65535 KB
难度:1
- 描述
- ACM的C++同学有好多作业要做,最头痛莫过于线性代数了,因为每次做到矩阵相乘的时候,大量的乘法都会把他搞乱,所以他想请你写个程序帮他检验一下计算结果是否正确。
- 输入
- 有多组测试数据,每行给出一组m,n,k(0<m,n,k<=50)。m,n,k表示两个矩阵的大小,其中:
矩阵A:m行n列。
矩阵B:n行k列。
接下来给出m*n个数表示矩阵A和n*k个数表示矩阵B,对于每个数s,0<=s<=1000。
当m,n,k同时为0时结束。
- 输出
- 计算两个矩阵的乘积并输出。
- 样例输入
-
2 1 3 1 2 1 2 3 2 2 3 1 2 3 4 1 0 1 0 1 0 0 0 0
- 样例输出
-
1 2 3 2 4 6 1 2 1 3 4 3
解题思路
这个是考验三重for循环的内部排序问题,思考到底是哪个是外层循环,哪个是内层循环。
代码
#include<stdio.h> #include<string.h> int a[60][60],b[60][60],c[60][60]; int main() { int m,n,k; int i,j,d; while(scanf("%d%d%d",&m,&n,&k),m+n+k) { for(i=1;i<=m;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); for(i=1;i<=n;i++) for(j=1;j<=k;j++) scanf("%d",&b[i][j]); memset(c,0,sizeof(c)); for(i=1;i<=m;i++) for(j=1;j<=k;j++) for(d=1;d<=n;d++)//主要是三重for循环的排序问题 //因为得到的是c[m][k]; //所以m,k,n c[i][j]+=a[i][d]*b[d][j]; for(i=1;i<=m;i++) { for(j=1;j<=k;j++) { printf("%d",c[i][j]); if(j!=k) printf(" "); } printf("\n"); } } return 0; }
-
例: -
矩阵A * B -
3 5 1 2 3 4 -
0 1 * = ?? -
4 2 5 6 7 8 -
c(i,j)=a的第i行*b的第j列 -
得到的是3*4的距阵啊,很简单的算术问题。3*1+5*5=28,得到是是第一行第一列的数值,3*2+5*6=36,得到是是第一行第二列的数值,3*3+5*7=44,得到是是第一行第三列的数值,3*4+5*8=52,得到是是第一行第四列的数值,这是第一行的四个数,。第二行第一列的数值是0*1+1*5=5,第二行第二列的数值是0*2+1*6=6,第二行第三列的数值是0*3+1*7=7,第二行第四列的数值是0*4+1*8=8,这是第二行的四个数值。第三行第一列的数值是4*1+2*5=14,第三行第二列的数值是4*2+2*6=20,第三行第三列的数值是4*3+2*7=26,第三行第四列的数值是4*4+2*8=32,第三行的四个数。得到的结果是 -
28 36 44 52 -
5 6 7 8 -
14 20 26 32
时间: 2024-10-09 13:56:38