简单题,按照矩阵的定义去做即可
源代码如下
//#pragma GCC diagnostic error"-std=c11"
#include<stdlib.h> //有随机数库
#include<malloc.h>
#include<time.h> //用于产生随机数种子
#include<math.h>
#include<string.h>
#include<stdio.h>
#define ELE int
typedef struct Metrix {
ELE *A;
int row, col;
}Metrix;
//初始化矩阵
void init(Metrix *M, int row, int col, int auto_read) {
M->A = (ELE*)calloc(row*col, sizeof(ELE));
M->row = row;
M->col = col;
if (auto_read) {
int i, size = row*col;
for (i = 0; i<size; i++)
scanf("%d", M->A + i);
}
}
#define IDX(M,r,c) (r*(M->col)+c)
ELE* get(Metrix *M, int r, int c) {
return M->A + IDX(M, r, c);
}
int main()
{
int m, l, n, i, j, k;
scanf("%d%d%d", &m, &l, &n);
Metrix L, R;
init(&L, m, l, 1);
init(&R, l, n, 1);
// init(M,m,n,0);
//矩阵乘法走起
for (i = 0; i<m; i++) {
for (j = 0; j<n; j++) {
ELE *lp = get(&L, i, 0), *rp = get(&R, 0, j);
ELE out = 0;
for (k = 0; k<l; k++) {
out += *(rp)*lp[k];
rp += n; //rp换下一行
}
printf("%d ", out);
}
printf("\b\n"); //删去空格再换行。
}
return 0;
}
#include "stdio.h"
#include <stdlib.h>
int main(int argc,char *argv[]){
int m,l,n,**a,**b,**c,*q,i,j,t;
printf("Please enter m, l & n(int 0<m,l,n<10 and must be m==n)...\n");
if(scanf("%d%d%d",&m,&l,&n)!=3 || m<1 || l<1 || n<1 || m>9 || l>9 || n>9 || m!=n){
printf("Input error, exit...\n");
return 0;
}
a=(int **)malloc(sizeof(int *)*m);//矩阵a的行指针
b=(int **)malloc(sizeof(int *)*l);//矩阵b的行指针
c=(int **)malloc(sizeof(int *)*m);//矩阵c的行指针
if(!a || !b || !c || (q=(int *)malloc(sizeof(int)*(m*l*2+m*m)))==NULL){//判断及总空间
printf("Application memory failure, exit...\n");
return 0;
}
for(t=i=0;i<m;a[i++]=q+t,t+=l);//把总空间组织成a,b,c三个矩阵
for(i=0;i<l;b[i++]=q+t,t+=n);
for(i=0;i<m;c[i++]=q+t,t+=n);
printf("Input matrix a...\n");
for(i=0;i<m;i++)//输入矩阵a
for(j=0;j<l;scanf("%d",a[i]+j++));
printf("Input matrix b...\n");
for(i=0;i<l;i++)//输入矩阵b
for(j=0;j<n;scanf("%d",b[i]+j++));
for(i=0;i<m;i++){//a,b相乘存于c并输出
for(j=0;j<n;j++){
for(c[i][j]=t=0;t<l;t++)
c[i][j] += a[i][t] * b[t][j];
printf("%d\t",c[i][j]);
}
printf("\n");
}
free(q);
free(a);
free(b);
free(c);
return 0;
}
运行样例: