# Simulation# Instruction Set# Memory Management

a349 - 2. 指令解譯器

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一個簡單的電腦指令集,包含 LOAD, STORE, ADD, MOVE 四種指令。程式需要讀取初始記憶體狀態和一系列指令,執行這些指令,並最終輸出暫存器 0 和記憶體 0 的值。

解題思路

這題的核心是模擬指令集。程式需要解析每條指令,並根據指令類型執行相應的操作。

  • LOAD: 從記憶體讀取資料到暫存器。
  • STORE: 從暫存器寫入資料到記憶體。
  • ADD: 將兩個暫存器的值相加,結果存入另一個暫存器。
  • MOVE: 將一個暫存器的值複製到另一個暫存器。

程式使用 mem 陣列模擬記憶體,reg 陣列模擬暫存器。程式迴圈讀取指令,並根據指令的字首 (is[0]) 判斷指令類型,然後執行相應的操作。

複雜度分析

  • 時間複雜度: O(n),其中 n 是指令的數量。因為程式需要迴圈執行每一條指令。
  • 空間複雜度: O(1),因為程式使用的記憶體空間是固定的,不隨輸入大小而變化。memreg 陣列的大小都是固定的。

程式碼

#include <iostream>
using namespace std;
int mem[8],n,reg[4],d,s,s2;
string is;
int main(){
	for(int i=0;i<8;++i)
		cin >> mem[i];
	cin >> n;
	while(n--){
		cin >> is;
		if(is[0]=='L'){
			cin >> d >> s;
			reg[d]=mem[s];
		}
		else if(is[0]=='S'){
			cin >> d >> s;
			mem[d]=reg[s];
		}
		else if(is[0]=='A'){
			cin >> d >> s >> s2;
			reg[d]=reg[s]+reg[s2];
		}
		else if(is[0]=='M'){
			cin >> d >> s;
			reg[d]=reg[s];
		}
	}
	cout << reg[0] << "\n" << mem[0];
}

Discussion