描述
考虑一个具有以下特性的的小型微处理器:
- 每个字有四位。
- 地址是两个字。 高字在前。 也就是说两个字组成的地址中的高字总是在低字的内存前。
- 内存占有256个字。
- 有两个累加器,A和B, 每个存储一个字。
- 一个有9个指令代码。每个指令需要至少一个字来存储代表这条指令的代码。有四条指令有参数并需要额外的两字。
每个四位代表的数字可以有值0~15,包括0和15在内,10进制。我们会以常见的十六进制的行式编写代码。也就是说A代表10,B代表11……
下面是9条指令:
代 码 | 字数 | 描述 |
0 | 3 | LD:装载指令中参数代表的地址的内容到累加器A |
1 | 3 | ST:向指令中参数代表的地址写入累加器A的内容 |
2 | 1 | SWP:交换A和B的内容 |
3 | 1 | ADD:将A和B中的内容相加,并将结果的低字写入A,高字写入B |
4 | 1 | INC:A中数加1,允许向上溢出,也就是说F+1-->0 |
5 | 1 | DEC:A中数减1,允许向下溢出,也就是说0-1-->F |
6 | 3 | BZ:如果A=0,下一个要执行的命令是在参数代表的地址的指令;如果A不是0,则参数被忽略不执行。 |
7 | 3 | BR:下一条要执行的指令在参数指定的地址。 |
8 | 1 | STP:程序中止执行。 |
微处理器每次都从00处的代码开始执行,并一直执行直到遇到中止的命令。
以下的例子表现了部分的程序并描述了它们的功效。
程序 | 描述 |
01A8 | 将在1A(10进制26)处的内容装入A,并终止。 |
01A512F8 | 将在1A(10进制26)处的内容装入A,A减1,把结果保存在2F处,并终止。 |
输入
在输入中将包含由正好256个字符组成的数行。每一行都代表内存的内容,地址00到FF。
如果一行代码的00处是8,程序结束输入。程序运行的过程中不会从内存中溢出,也就是说不会有F0到FF的指令让你去执行。
输出
对于给出的每一种内存状况,你必须从00开始模拟执行,当遇到停止命令时,将当时的内存中的内容输出成一行256个字符的串(由16进制表示)。
测试输入![]() | 期待的输出![]() | 时间限制![]() | 内存限制![]() | 额外进程![]() | |
---|---|---|---|---|---|
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
这个题只是看着很麻烦。。其实直接把所有情况过一遍就能出结果了,也没什么算法可言。
唯一可能出问题的就是6和7了,我一开始没读懂6和7的意思,其实是读到这个(7ab)的时候,就直接跳到“ab”位置进行此处该运行的操作。
一开始错的原因是把ab算出来之后直接让i等于那个位置,但是之后i进行了一次++操作,就导致i又往后跳了一位。所以i应该等于num-1,然后++操作之后就是num了。
AC代码:
#include<stdio.h>
#include<string.h>
char a[300];
int change(char t)
{
if (t == '0') return 0;
else if (t == '1') return 1;
else if (t == '2') return 2;
else if (t == '3') return 3;
else if (t == '4') return 4;
else if (t == '5') return 5;
else if (t == '6') return 6;
else if (t == '7') return 7;
else if (t == '8') return 8;
else if (t == '9') return 9;
else if (t == 'A') return 10;
else if (t == 'B') return 11;
else if (t == 'C') return 12;
else if (t == 'D') return 13;
else if (t == 'E') return 14;
else if (t == 'F') return 15;
}
char changeback(int t)
{
if (t == 0) return '0';
else if (t == 1) return '1';
else if (t == 2) return '2';
else if (t == 3) return '3';
else if (t == 4) return '4';
else if (t == 5) return '5';
else if (t == 6) return '6';
else if (t == 7) return '7';
else if (t == 8) return '8';
else if (t == 9) return '9';
else if (t == 10) return 'A';
else if (t == 11) return 'B';
else if (t == 12) return 'C';
else if (t == 13) return 'D';
else if (t == 14) return 'E';
else if (t == 15) return 'F';
}
int main()
{
while (scanf("%s", a) != EOF)
{
if (a[0] == '8')
break;
int b = 0, c = 0;
int len = strlen(a);
for (int i = 0; i < len; i++)
{
int num;
if (a[i] == '0')
{
num = change(a[i + 1]) * 16 + change(a[i + 2]);
b = change(a[num]);
i += 2;
}
else if (a[i] == '1')
{
num = change(a[i + 1]) * 16 + change(a[i + 2]);
a[num] = changeback(b);
i += 2;
}
else if (a[i] == '2')
{
int tmp;
tmp = b;
b = c;
c = tmp;
}
else if (a[i] == '3')
{
int tmp = b + c;
b = tmp % 16;
c = tmp / 16;
}
else if (a[i] == '4')
{
b++;
while (b >= 16)
b -= 16;
}
else if (a[i] == '5')
{
b--;
while (b < 0)
b += 16;
}
else if (a[i] == '6')
{
if (b == 0)
{
num = change(a[i + 1]) * 16 + change(a[i + 2]);
i = num-1;
}
else
i += 2;
}
else if (a[i] == '7')
{
num = change(a[i + 1]) * 16 + change(a[i + 2]);
i = num - 1;
}
else if (a[i] == '8')
{
break;
}
}
printf("%s\n", a);
}
return 0;
}