蓝桥杯 算法练习VIP 矩阵乘法

//问题描述
//  输入两个矩阵,分别是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;
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值