UVa 10033 - Interpreter

来源:互联网 发布:新手怎么学好网络优化 编辑:程序博客网 时间:2024/06/18 17:49

题目:给你一些指令,RAM地址从0-999,寄存器编号0-9,从RAM的000开始读取数据,判断指令执行了多少条次。

100 运行结束6ds 寄存器d的值加上寄存器s的值2dn 设置寄存器d的值为n(0-9)7ds 寄存器d的值乘以寄存器s的值3dn 寄存器d的值加上n8da 设置寄存器d的值为RAM中以寄存器a的值为地址的单元的值4dn 寄存器d的值乘以n9sa 设置RAM中以寄存器a的值为地址的单元的值为寄存器s的值5ds 设置寄存器d的值为寄存器s的值0ds 如果寄存器s中不是0,则程序跳转到寄存器d中地址

分析:模拟题,汇编解析器。直接模拟即可。

说明:注意操作方向不要写反。

#include <stdio.h>#include <stdlib.h>#include <string.h>#define op0(a) (a/100)#define op1(a) (a/10%10)#define op2(a) (a%10)int RAM[1000];int reg[10];int run( void ){int now = 0,count = 1;while ( 1 ) {int op = RAM[now ++];switch ( op0(op) ) {case 0 : if ( reg[op2(op)] ) now = reg[op1(op)]; break;case 1 : if ( !op1(op) && !op2(op) ) return count; break;case 2 : reg[op1(op)] = op2(op); break;case 3 : reg[op1(op)] = (reg[op1(op)]+op2(op))%1000; break;case 4 : reg[op1(op)] = (reg[op1(op)]*op2(op))%1000; break;case 5 : reg[op1(op)] = reg[op2(op)]; break;case 6 : reg[op1(op)] = (reg[op1(op)]+reg[op2(op)])%1000; break;case 7 : reg[op1(op)] = (reg[op1(op)]*reg[op2(op)])%1000; break;case 8 : reg[op1(op)] = RAM[reg[op2(op)]]; break;case 9 : RAM[reg[op2(op)]] = reg[op1(op)]; break;default: printf("command:%03d\n"); printf("runtime error!\n"); system("pause");break;}count ++;}}int main(){int T;while ( scanf("%d",&T) != EOF ) {getchar();getchar();while ( T -- ) {memset( RAM, 0, sizeof(RAM) );memset( reg, 0, sizeof(reg) );int  in_count = 0;char buf[10];while ( gets(buf) ) {if ( !strcmp(buf,"") ) break;sscanf(buf,"%d",RAM+in_count);in_count ++;}printf("%d\n",run());if ( T ) printf("\n");}}return 0;}

0 0
原创粉丝点击