前言: {\color{Blue}前言:} 前言:本系列题使用的是“PTA中的团体程序设计天梯赛——练习集”的题库,难度有L1、L2、L3三个等级,分别对应团体程序设计天梯赛的三个难度,如有需要可以直接查看对应专栏。发布个人的刷题笔记的同时,也是希望可以帮助到有需要的人,我会尽量的解释每一步代码,如有错误或者可以优化的地方还望各位CSDN的朋友可以指出来。更新速度预计是每天不定时更新三道,若当天没有更新后期将会补上。
题目
给定两个矩阵 A A A和 B B B,要求你计算它们的乘积矩阵 A B AB AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若 A A A有 R a R_a Ra行、 C a C_a Ca 列, B B B有 R b R_b Rb行、 C b C_ b Cb列,则只有 C a C_a Ca与 R b R_b Rb相等时,两个矩阵才能相乘。
输入格式
输入先后给出两个矩阵
A
A
A和
B
B
B。对于每个矩阵,首先在一行中给出其行数
R
R
R和列数
C
C
C,随后
R
R
R行,每行给出
C
C
C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的
R
R
R和
C
C
C都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵
A
B
AB
AB,否则输出Error: Ca != Rb
,其中Ca
是
A
A
A的列数,Rb
是
B
B
B的行数。
输入样例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
题解
def multiply_matrices(A, B):
# 获取矩阵 A 和 B 的行列数
R_a, C_a = len(A), len(A[0])
R_b, C_b = len(B), len(B[0])
# 判断矩阵 A 和 B 是否可以相乘
if C_a != R_b:
return f"Error: {C_a} != {R_b}"
# 初始化乘积矩阵 AB
AB = [[0] * C_b for _ in range(R_a)]
# 计算乘积矩阵 AB
for i in range(R_a):
for j in range(C_b):
for k in range(C_a):
AB[i][j] += A[i][k] * B[k][j]
"""
通过三重循环遍历矩阵 A 和 B 的元素,计算乘积矩阵 AB 的每个元素。
外层循环 for i in range(R_a): 遍历矩阵 A 的每一行。
中层循环 for j in range(C_b): 遍历矩阵 B 的每一列。
内层循环 for k in range(C_a): 遍历矩阵 A 的列和矩阵 B 的行,用于计算乘积。
其中,A[i][k] 表示矩阵 A 的第 i 行第 k 列的元素,B[k][j] 表示矩阵 B 的第 k 行第 j 列的元素。
乘积矩阵 AB 的第 i 行第 j 列的元素初始值为 0。在每次迭代中,
将矩阵 A 的第 i 行第 k 列的元素与矩阵 B 的第 k 行第 j 列的元素相乘,然后累加到乘积矩阵 AB 的对应位置上。
通过这三重循环的嵌套,对矩阵 A 和 B 的每个元素进行遍历和计算,最终得到完整的乘积矩阵 AB。"""
return AB
# 读取矩阵 A 的行数和列数
R_a, C_a = map(int, input().split())
# 读取矩阵 A 的元素
A = []
for _ in range(R_a):
row = list(map(int, input().split()))
A.append(row)
# 读取矩阵 B 的行数和列数
R_b, C_b = map(int, input().split())
# 读取矩阵 B 的元素
B = []
for _ in range(R_b):
row = list(map(int, input().split()))
B.append(row)
# 计算乘积矩阵 AB
result = multiply_matrices(A, B)
# 输出结果
if isinstance(result, str):
print(result)
else:
R_ab, C_ab = len(result), len(result[0])
print(f"{R_ab} {C_ab}")
for row in result:
print(" ".join(str(num) for num in row))