天天看點

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