、矩阵乘法
描述: 编程计算两个矩阵的乘积并输出。若给定的矩阵不能相乘,则输出"Matrix Can't
Multiply!"。若计算机内存不足以计算给定矩阵的乘积, 则输出"Not Enough Memory!"。
输入: 第一行输入两个整数,表示第一个矩阵的行数r1 和列数c1。
第二行到第 r1+1 行顺次输入c1*r1 个整数,表示第一个矩阵的内容。
第 r1+2 行输入两个整数,表示第二个矩阵的行数r2 和列数c2。
第 r1+3 行到第r1+r2+2 行顺次输入c2*r2 个整数,表示第二个矩阵的内容。
提示:设A=(aij)是一个m×s 矩阵,B=(bij)是一个s×n 矩阵,那么规定矩阵A 与
矩阵 B 的乘积是一个m×n 矩阵C=(cij),其中:
Cij=ai1b1j+ai2b2j+…+aisbsj=Σaikbkj (i=1,2,…,m;j=1,2,…,n;k=1,2,…,s)
注:若第一个矩阵的列数不等于第二个矩阵的行数,则不能进行乘法运算。
提示:需用动态二维数组实现。
输出: 按行列顺序输出乘积矩阵中的所有数据。
输入样例:
2 2 <---第一个矩阵的行数和列数
3 4
5 6
2 3 <---第二个矩阵的行数和列数
1 2 3
4 5 6
输出样例:
19 26 33
29 40 51
#include<stdio.h>
#include<malloc.h>
void main()
{
int **mata=NULL,**matb=NULL,ar,ac,br,bc,i,j,k,**matres=NULL;//矩阵a,b,a的行,a的列,b的行,b的列,循环变量i,j,k,相乘的结果
scanf("%d%d",&ar,&ac);//接受矩
阵a的行列值
if(!(mata=(int**)malloc(ar*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
for(i=0;i<ac;i++)
{
if(!(mata[i]=(int*)malloc(ac*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
}
for(i=0;i<ar;i++)
for(j=0;j<ac;j++)
scanf("%d",&mata[i][j]);
scanf("%d%d",&br,&bc);////接受矩阵b的行列值
if(ac!=br)
{
printf("Matrix Can't Multiply!");
return;
}
if(!(matb=(int**)malloc(br*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
for(i=0;i<bc;i++)
{
if(!(matb[i]=(int*)malloc(bc*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
}
for(i=0;i<br;i++)
for(j=0;j<bc;j++)
scanf("%d",&matb[i][j]);
if(!(matres=(int**)malloc(ar*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
for(i=0;i<bc;i++)
{
if(!(matres[i]=(int*)malloc(bc*sizeof(int))))
{
printf("Not Enough Memory!"); //内存不足malloc会返回NULL
return;
}
}
for(i=0;i<ar;i++)
for(j=0;j<bc;j++)
matres[i][j]=0;//初始化0
/*计算*/
for(i=0;i<ar;i++)
for(j=0;j<bc;j++)
for(k=0;k<ac;k++)
matres[i][j]+=mata[i][k]*matb[k][j];
/*输出*/
for(i=0;i<ar;i++)
{
for(j=0;j<bc;j++)
printf("%d ",matres[i][j]);
printf("\n");
}
}