首页 > 代码库 > 1411261432-ny-AB Problem II

1411261432-ny-AB Problem II

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


1411261432-ny-AB Problem II