ZeroJudge A349: 指令解譯器

志豪家裡有一部很珍貴的骨董電腦。這部電腦只有四個 16-位元 (bit) 的暫存器和八個字組 (word,每個字組亦為 16-bit) 的主記憶體。它的中央處理器的部份指令格式如下:

指令指令格式指令意義
LOADLOAD RD MS將記憶體位址 MS 的字組數值載入暫存器 RD
STORESTORE MD RS將暫存器 RS 的數值存回記憶體位址 MD 的字組
ADDADD RD RS1 RS2將暫存器 RS1 和 RS2 的數值和存入暫存器 RD
MOVEMOVE RD RS將暫存器 RS 的數值存入暫存器 RD

假設暫存器的編號從 0 開始,主記憶體位址也同樣從 0 開始。若已知主記憶體位址 0 和 1 的數值為 123 和 456,以下程式片段執行後會將 579 (123 + 456) 存入主記憶體位址 2 的字組。

LOAD 0 0
LOAD 1 1
ADD 2 0 1
STORE 2 2

請你撰寫一個程式,讀入一串指令(只會出現上述四種指令),模擬這串指令執行的結果,並將執行後第一個暫存器和第一個記憶體字組的內容顯示出來。

假設 1:所有暫存器的初始數值皆為 0。

假設 2:計算過程中不會有溢位情形發生。

範例測資

範例輸入範例輸出
第一行至第八行為八個記憶體字組的初始數值。
第九行有一個正整數 N (1 ≤ N ≤ 50),代表指令個數。
第十行開始有 N 行,每一行為一個指令。
請依序輸出第一個暫存器(編號 0 號)和第一個記憶體字組(編號 0 號)的數值內容。
123
456
0
0
0
0
0
0
4
LOAD 0 0
LOAD 1 1
ADD 2 0 1
STORE 2 2
123
123
100
200
300
400
0
0
0
0
7
LOAD 0 0
LOAD 1 1
ADD 2 0 1
LOAD 0 2
MOVE 3 2
ADD 0 3 1
STORE 3 0
500
100
ZeroJudge A349 範例測資

解題思路

宣告兩個空的陣列,並且使用判斷式收資料。

範例程式碼-ZeroJudge A349: 指令解譯器

#include <iostream>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int num[8] = {}, tempMem[8] = {};
    for (int i = 0; i < 8; i++) {
        cin >> num[i];
        tempMem[i] = -1;
    }
    int N;
    cin >> N;
    for (int i = 0; i<N; i++) {
        string str;
        cin >> str;
        if (str == "LOAD") {
            int RD, MS;
            cin >> RD >> MS;
            tempMem[RD] = num[MS];
        }
        else if (str == "STORE") {
            int MD, RS;
            cin >> MD >> RS;
            num[MD] = tempMem[RS];
        }
        else if (str == "ADD") {
            int RD, RS1, RS2;
            cin >> RD >> RS1 >> RS2;
            tempMem[RD] = tempMem[RS1] + tempMem[RS2];
        }
        else if (str == "MOVE") {
            int RD, RS;
            cin >> RD >> RS;
            tempMem[RD] = tempMem[RS];
        }
    }
    cout << tempMem[0] << "\n" << num[0] << "\n";
}

//ZeroJudge A349
//Dr. SeanXD

發佈留言