【Go语言入门150题】L1-048矩阵A乘以B(15

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

【题解】【PTA团体程序设计天梯赛】

L1-048 矩阵A乘以B (15 分) Go语言|Golang

给定两个矩阵AB,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若ARa行、Ca列,BRb行、Cb列,则只有CaRb相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵AB。对于每个矩阵,首先在一行中给出其行数R列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的RC都是正数,并且所有整数的绝对值不超过100

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中CaA的列数,RbB的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
复制代码

结尾无空行

输出样例1:

2 4
20 22 24 16
53 58 63 28
复制代码

结尾无空行

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
复制代码

结尾无空行

输出样例2:

Error: 2 != 3
复制代码

结尾无空行

思路:

  • 矩阵的运算,如果不懂矩阵的运算要自己补一下这方向的知识了。
  • 注意运算是有规律的,所以可以按照规律来进行技术就好了。
  • 还有一点是注意输出的格式。

代码如下:

package main

import "fmt"

func main() {
	var rowa, linea int
	_, _ = fmt.Scan(&rowa, &linea)
	var a [100][100]int
	for i := 0; i < rowa; i++ {
		for j := 0; j < linea; j++ {
			_, _ = fmt.Scan(&a[i][j])
		}
	}
	var rowb, lineb int
	_, _ = fmt.Scan(&rowb, &lineb)
	var b [100][100] int
	for i := 0; i < rowb; i++ {
		for j := 0; j < lineb; j++ {
			_, _ = fmt.Scan(&b[i][j])
		}
	}
	if linea != rowb {  // 如果不满足这个条件,就输出这个
		fmt.Printf("Error: %d != %d", linea, rowb)
		return
	}
	fmt.Printf("%d %d\n",rowa,lineb)  // 先输出行和列
	var c [100][100]int
	for i := 0; i < rowa; i++ {  //进行计算
		for j := 0; j < lineb; j++ {
			sum:=0
			for k := 0; k < linea; k++ {
				sum += a[i][k] * b[k][j]  // 找到规律就行了
			}
			c[i][j] = sum  // 写入到新的列表当中
		}
	}

	for i := 0; i < rowa; i++ {
		for j := 0; j < lineb; j++ {
			if j == lineb-1 {
				fmt.Printf("%d", c[i][j])  // 注意输出格式
			}else{
				fmt.Printf("%d ", c[i][j])
			}
		}
		if i != rowa-1 {
			fmt.Println()
		}
	}
}
复制代码