也是条简单题,不过题目让我们模拟CPU挺有意思。
出现过的问题:要注意地址都是十六进制表示的,即命令(010),表示的地址(10)是十六进制,也就是指十进制的16。刚开始就是这个地方搞错了,看不懂意思。。。。
#include "iostream"
using namespace std;
int nMemory[256];
int A, B;
int ExtractCommand(int nCmdIndex)
{
int cmd = nMemory[nCmdIndex];
int nNewCmdIndex = nCmdIndex + 1;
int pos = nMemory[nCmdIndex + 1] * 10 + nMemory[nCmdIndex + 2];
switch ( cmd )
{
case 0 :
A = nMemory[pos];
nNewCmdIndex += 2;
break;
case 1 :
nMemory[pos] = A;
nNewCmdIndex += 2;
break;
case 2 :
A = A + B, B = A - B, A = A - B;
break;
case 3 :
A = A + B;
B = A / 16;
A = A % 16;
break;
case 4 :
A = (A + 1) % 16;
break;
case 5 :
A = (A - 1) % 16;
break;
case 6 :
if (A == 0)
{
nNewCmdIndex = pos;
}
break;
case 7 :
nNewCmdIndex = pos;
break;
case 8 :
nNewCmdIndex = 256;
default :
break;
}
return nNewCmdIndex;
}
int main(int argc, char *argv[])
{
int i;
while( 1 )
{
for(i = 0; i < 256 && cin >> hex >> nMemory[i] ; i++ );
if (i < 256)
{
break;
}
for( i = 0; i < 256 ; )
{
i = ExtractCommand(i);
}
}
return 0;
}
#include "iostream"
using namespace std;
int nMemory[256];
int A, B;
int ExtractCommand(int nCmdIndex)
{
int cmd = nMemory[nCmdIndex];
int nNewCmdIndex = nCmdIndex + 1;
int pos = nMemory[nCmdIndex + 1] * 10 + nMemory[nCmdIndex + 2];
switch ( cmd )
{
case 0 :
A = nMemory[pos];
nNewCmdIndex += 2;
break;
case 1 :
nMemory[pos] = A;
nNewCmdIndex += 2;
break;
case 2 :
A = A + B, B = A - B, A = A - B;
break;
case 3 :
A = A + B;
B = A / 16;
A = A % 16;
break;
case 4 :
A = (A + 1) % 16;
break;
case 5 :
A = (A - 1) % 16;
break;
case 6 :
if (A == 0)
{
nNewCmdIndex = pos;
}
break;
case 7 :
nNewCmdIndex = pos;
break;
case 8 :
nNewCmdIndex = 256;
default :
break;
}
return nNewCmdIndex;
}
int main(int argc, char *argv[])
{
int i;
while( 1 )
{
for(i = 0; i < 256 && cin >> hex >> nMemory[i] ; i++ );
if (i < 256)
{
break;
}
for( i = 0; i < 256 ; )
{
i = ExtractCommand(i);
}
}
return 0;
}