//问题描述
// 输入两个矩阵,分别是ms,sn大小。输出两个矩阵相乘的结果。
//输入格式
// 第一行,空格隔开的三个正整数m,s,n(均不超过200)。
// 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)。
// 接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)。
//输出格式
// m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。
//样例输入
//2 3 2
//1 0 -1
//1 1 -3
//0 3
//1 2
//3 1
//样例输出
//-3 2
//-8 2
//
//提示
//矩阵C应该是m行n列,其中C(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。
//例如样例中C(1,1)=(1,0,-1)(0,1,3) = 1 * 0 +01+(-1)*3=-3
不知道你们,我觉得这个阅读理解杯,是解释题目是越来越抽象了。下面我用我自己的语言来解释一下:
给你三个数字:m s n
array1[m][s]、array2[s][n]
如:2 3 2
array1[2][3]、array2[3][2]
a b c a 0 3
1 0 -1 b 1 2
1 1 -3 c 3 1
array1的a b c分别对应 1 0 -1
array2的a b c分别对应 0 1 3
那么array3的[0][0]=aa+bb+c*c=-3
0 + 0 + -3=-3
以下是代码了
import java.util.Scanner;
public class 矩阵乘法 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int p = in.nextInt();
if (m <= 200 && n <= 200 && p <= 200) {
int a[][] = new int[m][n];
int b[][] = new int[n][p];
int c[][] = new int[m][p];
//Get_a是用来给a数组赋值的
a = Get_a(a, m, n);
//Get_b是用来给b数组赋值的
b = Get_b(b, n, p);
//用来计算a*b得到c的方法
c = Get_c(a, b, c);
for(int i=0;i<c.length;i++) {
for(int i2=0;i2<c[i].length;i2++) {
System.out.print(c[i][i2]+" ");
}
System.out.println();
}
}
}
public static int[][] Get_c(int a[][], int b[][], int c[][]) {
//因为是m p n a[m][p] b[p][n] c[m][n]
for (int i = 0; i < a.length; i++) {
for (int i1 = 0; i1 < b[0].length; i1++) {
int t = 0;
for (int i2 = 0; i2 < a[0].length; i2++) {
t += a[i][i2] * b[i2][i1];
}
c[i][i1] = t;
}
}
return c;
}
public static int[][] Get_a(int a[][], int m, int n) {
Scanner in = new Scanner(System.in);
for (int i = 0; i < m; i++) {
for (int i2 = 0; i2 < n; i2++)
a[i][i2] = in.nextInt();
}
return a;
}
public static int[][] Get_b(int b[][], int n, int p) {
Scanner in = new Scanner(System.in);
for (int i = 0; i < n; i++) {
for (int i2 = 0; i2 < p; i2++)
b[i][i2] = in.nextInt();
}
return b;
}
}