天天看点

【Go语言入门100题】048 矩阵A乘以B (15 分) Go语言|Golang

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

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

输入格式:

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

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是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      

思路:

矩阵的运算,如果不懂矩阵的运算要自己补一下这方向的知识了。

注意运算是有规律的,所以可以按照规律来进行技术就好了。

还有一点是注意输出的格式。

代码如下:

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()
        }
    }
}