POJ 2410:Simple Computers 模拟题
2012-02-14 21:29
239 查看
题目URL:http://poj.org/problem?id=2410
这道题最初是用字符串模拟内存的一位,看了讨论版其他认的代码之后我才发现这种方式太过复杂。完全可以用一个int或者一个char来模拟一个指令。
自己总结下,取一个字节的后5位的整数值,可以byte % 32就可以了,而取一个字节的前三位则可以byte >> 5,总结下之后发现位操作的强大之处了。于是又用位操作把这道题重新AC了一遍,用位操作之后,少了30行代码。
字符串模拟的AC代码:
用char类型模拟的AC代码:
这道题最初是用字符串模拟内存的一位,看了讨论版其他认的代码之后我才发现这种方式太过复杂。完全可以用一个int或者一个char来模拟一个指令。
自己总结下,取一个字节的后5位的整数值,可以byte % 32就可以了,而取一个字节的前三位则可以byte >> 5,总结下之后发现位操作的强大之处了。于是又用位操作把这道题重新AC了一遍,用位操作之后,少了30行代码。
字符串模拟的AC代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdio.h> using namespace std; char ins[32][10]; char accu[10]; int pc; int getType(char *ins) { return (ins[0]-'0')*4 + (ins[1]-'0')*2 + (ins[2]-'0'); } int getOperand(char *ins) { int res(0); for(int i(3); i<8; ++i) res = res * 2 + ins[i] - '0'; return res; } int getValue(char *ins) { int res(0); for(int i(0); i<8; ++i) res = res * 2 + ins[i] - '0'; return res; } void dec() { for(int i(7); i>=0; --i) { if(accu[i] == '1') { accu[i] = '0'; break; } else accu[i] = '1'; } } void inc() { int carry(1); for(int i(7); i>=0; --i) { if(accu[i] == '1' && carry == 1) accu[i] = '0'; else if(accu[i] == '0' && carry == 1) accu[i] = '1', carry = 0; else if(!carry) break; } } int main() { bool halt; while(scanf("%s", ins) != EOF) { for(int i(1); i<32; ++i) scanf("%s", ins+i); halt = false; pc = 0; memset(accu, '0', sizeof(accu)); while(!halt && pc < 32) { switch(getType(ins[pc])) { case 0: memcpy(ins[getOperand(ins[pc])], accu, sizeof(accu)); pc = (pc + 1) % 32; break; case 1: memcpy(accu, ins[getOperand(ins[pc])], sizeof(accu)); pc = (pc + 1) % 32; break; case 2: if(!getValue(accu)) pc = getOperand(ins[pc]); else pc = (pc + 1) % 32; break; case 3: pc = (pc + 1) % 32; break; case 4: dec(); pc = (pc + 1) % 32; break; case 5: inc(); pc = (pc + 1) % 32; break; case 6: pc = getOperand(ins[pc]); break; case 7: halt = true; break; } } for(int i(0); i<8; ++i) printf("%c", accu[i]); printf("\n"); } system("pause"); return 0; }
用char类型模拟的AC代码:
#include <iostream> #include <stdio.h> using namespace std; unsigned char ins[32], accu, pc; char str[10]; unsigned char getValue(char *ins) { unsigned char res(0); for(int i(0); i<8; ++i) res = res * 2 + ins[i] - '0'; return res; } int main() { bool halt; int type, value; while(scanf("%s", str) != EOF) { ins[0] = getValue(str); for(int i(1); i<32; ++i) scanf("%s", str), ins[i] = getValue(str); halt = false; pc = accu = 0; while(!halt) { type = ins[pc] >> 5; value = ins[pc] % 32; switch(type) { case 0: ins[value] = accu; pc = (pc + 1) % 32; break; case 1: accu = ins[value]; pc = (pc + 1) % 32; break; case 2: if(!accu) pc = value; else pc = (pc + 1) % 32; break; case 3: pc = (pc + 1) % 32; break; case 4: --accu; pc = (pc + 1) % 32; break; case 5: ++accu; pc = (pc + 1) % 32; break; case 6: pc = ins[pc] % 32; break; case 7: halt = true; break; } } for(int i(7); i>=0; --i) printf("%d", (accu >> i) & 1); printf("\n"); } system("pause"); return 0; }
相关文章推荐
- poj 1068 模拟题
- poj 1051 P,MTHBGWB (模拟题字符串 )
- 模拟题 poj 1068、 2632 、 1573、 2993、 2996
- POJ 1033 磁盘文件碎片整理 模拟题 栈应用
- POJ 2017 计算公路里程 模拟题
- poj1877模拟题
- POJ 1027 The Same Game 模拟题
- POJ 2996:Help Me with the Game 模拟题
- poj 1573 Robot Motion【模拟题 写个while循环一直到机器人跳出来】
- POJ 3371 Flesch Reading Ease (模拟题)
- poj2410
- POJ 1033 磁盘文件碎片整理 模拟题 栈应用
- POJ 1016 模拟题
- POJ 1102 经典模拟题(例举两种方法)
- 数黑格有多少个,模拟题,POJ(1656)
- poj1472[模拟题]
- POJ 3032 Card Trick(较好模拟题,双向队列deque)
- poj_1008 Maya Calendar(模拟题)
- Robot Motion(POJ 1573 模拟题)
- POJ 2632 模拟题