题目描述
矩阵int a[n][n],矩阵int b[n][n](1≤n≤20)。矩阵的大小和数据由用户输入。输出新的矩阵c=a*b,以及其中的最小值和最大值,输出格式:
c00 c01 c02 …… c0(n-2) c0(n-1)
c10 c11 c12 …… c1(n-2) c1(n-1)
c20 c21 c22 …… c2(n-2) c2(n-1)
…… …… …… …… …… ……
c(n-2)0 c(n-2)1 c(n-2)2 …… c(n-2)(n-2) c(n-2)(n-1)
c(n-1)0 c(n-1)1 c(n-1)2 …… c(n-1)(n-2) c(n-1)(n-1)
cmin cmax
矩阵乘法的计算方法 :
对于矩阵A[n][n]*B[n][n],
相乘的结果为矩阵C[n][n],且对于矩阵C中每一项都有
C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ..... + A[i][n-1]*B[n-1][j]
关于输入
第一行为矩阵的大小,后面跟着输入两个矩阵
n
a00 a01 a02 …… a0(n-2) a0(n-1)
a10 a11 a12 …… a1(n-2) a1(n-1)
a20 a21 a22 …… a2(n-2) a2(n-1)
…… …… …… …… …… ……
a(n-2)0 a(n-2)1 a(n-2)2 …… a(n-2)(n-2) a(n-2)(n-1)
a(n-1)0 a(n-1)1 a(n-1)2 …… a(n-1)(n-2) a(n-1)(n-1)
b00 b01 b02 …… b0(n-2) b0(n-1)
b10 b11 b12 …… b1(n-2) b1(n-1)
b20 b21 b22 …… b2(n-2) b2(n-1)
…… …… …… …… …… ……
b(n-2)0 b(n-2)1 b(n-2)2 …… b(n-2)(n-2) b(n-2)(n-1)
b(n-1)0 b(n-1)1 b(n-1)2 …… b(n-1)(n-2) b(n-1)(n-1)
关于输出
矩阵c
c00 c01 c02 …… c0(n-2) c0(n-1)
c10 c11 c12 …… c1(n-2) c1(n-1)
c20 c21 c22 …… c2(n-2) c2(n-1)
…… …… …… …… …… ……
c(n-2)0 c(n-2)1 c(n-2)2 …… c(n-2)(n-2) c(n-2)(n-1)
c(n-1)0 c(n-1)1 c(n-1)2 …… c(n-1)(n-2) c(n-1)(n-1)
cmin cmax
例子输入
3
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
例子输出
30 36 42
66 81 96
102 126 150
30 150
提示信息
注意矩阵边界,以防计算时越界
请问有哪里需要解答的地方吗?
#include<stdio.h>
int main()
{
int a[20][20],b[20][20],c[20][20]={0},i,j,k,min,max,n;
scanf("%d",&n);
for(i=0;i<=n-1;++i)
for(j=0;j<=n-1;++j)
scanf("%d",&a[i][j]);
for(i=0;i<=n-1;++i)
for(j=0;j<=n-1;++j)
scanf("%d",&b[i][j]);
for(i=0;i<=n-1;++i)
for(j=0;j<=n-1;++j)
for(k=0;k<=n-1;++k)
c[i][j]+=a[i][k]*b[k][j];
min=max=c[0][0];
for(i=0;i<=n-1;++i)
for(j=0;j<=n-1;++j)
{
if(min>c[i][j])
min=c[i][j];
if(max<c[i][j])
max=c[i][j];
}
for(i=0;i<=n-1;++i)
{
for(j=0;j<=n-1;++j)
{
printf("%d",c[i][j]);
if(j!=n-1)
printf(" ");
}
printf("\n");
}
printf("%d %d",min,max);
return 0;
}
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
struct Matrix
{
int num_rows;
int num_cols;
int *data;
};
struct Matrix *alloc_matrix(int m, int n)
{
assert(m > 0 && n > 0);
struct Matrix *matrix = (struct Matrix *)malloc(sizeof(struct Matrix));
matrix->num_rows = m;
matrix->num_cols = n;
matrix->data = (int *)malloc(m * n * sizeof(int));
return matrix;
}
void free_matrix(struct Matrix *matrix)
{
free(matrix->data);
free(matrix);
}
int get_value(const struct Matrix *matrix, int i, int j)
{
return matrix->data[i * matrix->num_cols + j];
}
void set_value(struct Matrix *matrix, int i, int j, int value)
{
matrix->data[i * matrix->num_cols + j] = value;
}
void multiply(const struct Matrix *A, const struct Matrix *B, struct Matrix *C)
{
assert(A->num_cols == B->num_rows);
assert(C->num_rows == A->num_rows);
assert(C->num_cols == B->num_cols);
for (int i = 0; i < C->num_rows; i++)
{
for (int j = 0; j < C->num_cols; j++)
{
int x = 0;
for (int k = 0; k < B->num_rows; k++)
{
int a = get_value(A, i, k);
int b = get_value(B, k, j);
x += a * b;
}
set_value(C, i, j, x);
}
}
}
int get_max_value(const struct Matrix *matrix)
{
int v = INT_MIN;
int size = matrix->num_rows * matrix->num_cols;
for (int i = 0; i < size; i++)
{
if (matrix->data[i] > v)
v = matrix->data[i];
}
return v;
}
int get_min_value(const struct Matrix *matrix)
{
int v = INT_MAX;
int size = matrix->num_rows * matrix->num_cols;
for (int i = 0; i < size; i++)
{
if (matrix->data[i] < v)
v = matrix->data[i];
}
return v;
}
void read_matrix(struct Matrix *matrix)
{
for (int i = 0; i < matrix->num_rows; i++)
{
for (int j = 0; j < matrix->num_cols; j++)
{
int x;
scanf("%d", &x);
set_value(matrix, i, j, x);
}
}
}
void write_matrix(const struct Matrix *matrix)
{
for (int i = 0; i < matrix->num_rows; i++)
{
for (int j = 0; j < matrix->num_cols; j++)
{
printf("%d ", get_value(matrix, i, j));
}
printf("\n");
}
}
int main()
{
int n = 0;
scanf("%d", &n);
if (n <= 0)
{
printf("invalid matrix size\n");
return -1;
}
struct Matrix *a = alloc_matrix(n, n);
struct Matrix *b = alloc_matrix(n, n);
struct Matrix *c = alloc_matrix(n, n);
read_matrix(a);
read_matrix(b);
multiply(a, b, c);
write_matrix(c);
printf("%d %d\n", get_min_value(c), get_max_value(c));
free_matrix(a);
free_matrix(b);
free_matrix(c);
return 0;
}