Problem G: Matrix Problem (III) : Array Practice
Time Limit: 1 Sec Memory Limit: 4 MBSubmit: 2826 Solved: 779
[ Submit][ Status][ Web Board]
Description
求两个矩阵A、B的乘积C=AB。根据矩阵乘法的定义,只有A的列数和B的行数相同才能相乘。可以确保所有运算结果都在int类型的范围之内。
Input
输入数据为多个矩阵(最少2个),每个矩阵以两个正整数m和n开始,满足0<m,n<=100,接下来为一个m行n列的矩阵A。当输入的m和n均为0时,表示输入数据结束。
Output
对输入的矩阵两两相乘:第1个和第2个相乘、第1个和第2个相乘的结果和第3个相乘……按顺序输出矩阵相乘的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。
若前k个矩阵相乘的结果和第k+1个矩阵无法相乘(即不满足矩阵乘法定义),则输出“Not satisfied the definition of matrix multiplication!”。然后用第k+1个矩阵去和第k+2个矩阵相乘。最后一个矩阵只做乘数。
每两组输出之间用一个空行分隔开。
Sample Input
2 3
1 1 1
1 1 1
3 3
1 2 3
4 5 6
7 8 9
3 1
0
0
0
0 0
Sample Output
12 15 18
12 15 18
0
0
HINT
矩阵的乘法就是一行乘以一列加起来做一个元素。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 101
int get_matrix(int ma[MAX_SIZE][MAX_SIZE], int m, int n)
{
int i,j;
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
scanf("%d",&ma[i][j]);
}
int put_matrix(int ma[MAX_SIZE][MAX_SIZE], int m, int n)
{
int i,j;
for(i = 0; i < m; i++)
{
for(j = 0; j < n-1; j++)
printf("%d ",ma[i][j]);
printf("%d\n",ma[i][j]);
}
}
int mul_matrix(int pr[MAX_SIZE][MAX_SIZE], int m1[MAX_SIZE][MAX_SIZE], int m2[MAX_SIZE][MAX_SIZE], int m, int n, int q)
{
int h,l,dyh,dyl,deh,del;
for(h = 0; h < m; h++)
{
dyh = h;
for(del = 0; del < q; del++)
{
int sum = 0;
for(deh = 0; deh < n; deh++)
{
sum += m1[dyh][deh]*m2[deh][del];
}
pr[h][del] = sum;
}
}
}
int main()
{
int m1, n1,m2,n2,cc = 0;
int m_1,n_1,ks = 0;
int product[MAX_SIZE][ MAX_SIZE];
int matrix1[MAX_SIZE][MAX_SIZE];
int matrix2[MAX_SIZE][MAX_SIZE];
int i,j;
memset(product,0,sizeof(product));
memset(matrix1,0,sizeof(matrix1));
memset(matrix2,0,sizeof(matrix2));
scanf("%d%d", &m1, &n1);
get_matrix(matrix1, m1, n1);
if(m1 == 0 && n1 == 0)
return 0;
po1:
scanf("%d%d", &m2, &n2);
get_matrix(matrix2, m2, n2);
if(m2 == 0 && n2 == 0)
return 0;
if(n1 != m2)
goto wrong;
mul_matrix(product, matrix1, matrix2, m1, n1, n2);
if(ks != 0)
printf("\n");
put_matrix(product, m1, n2);
ks++;
//----------------copy--------------------
memset(matrix1,0,sizeof(matrix1));
for(i = 0;i < m1;i++)
for(j = 0;j < n2;j++)
matrix1[i][j] = product[i][j];
n1 = n2;
goto po1;
//---------------copy end-----------------
//---------------if wrong-----------------
wrong:
printf("\nNot satisfied the definition of matrix multiplication!\n");
memset(matrix1,0,sizeof(matrix1));
for(i = 0;i < m2;i++)
for(j = 0;j < n2;j++)
matrix1[i][j] = matrix2[i][j];
m1 = m2;
n1 = n2;
goto po1;
//---------------wrong end----------------
return 0;
}
/**************************************************************
Problem: 1055
User: 201401061013
Language: C
Result: Accepted
Time:12 ms
Memory:796 kb
****************************************************************/