1 条题解
-
0
这道题特别难,访问了一位大佬的帖子,汲取了代码精华,才最终做出! 代码如下:
#include<bits/stdc++.h> using namespace std; #define int long long #define ull unsigned int #define N 65536 int memory[N]; ull code[N] = { }; /* 0 Input 1 Output 2 Write 3 Copy 4 Calculate (& | ~ ^ << >>) 5 Calculate (+ - * / %) 6 Goto 7 If-goto 8 x++ 9 x-- f Exit */ signed main() { for(int i=0;;i=(i+1)%N) { int op=code[i]>>60; if(op==0) //Input { int p=code[i]&65535; cin >> memory[ (code[i]>>56)&1 ? memory[p] : p ]; } else if(op==1) //Output { int p=code[i]&65535, val = memory[ (code[i]>>56)&1 ? memory[p] : p ]; if((code[i]>>57)&1) { cout<<char(val&127); } else { cout<<val; } } else if(op==2) //Write { int p = (code[i]>>32)&65535, val = code[i]&((1ll<<32)-1); memory[ (code[i]>>56)&1 ? memory[p] : p ] = val; } else if(op==3) //Copy { int pf = (code[i]>>16)&65535, pt = code[i]&65535; int val = memory[ (code[i]>>55)&1 ? memory[pf] : pf ]; memory[ (code[i]>>56)&1 ? memory[pt] : pt ] = val; } else if(op==4) //Calculate (& | ~ ^ << >>) { int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3; int op2 = (code[i]>>52)&15; if(op2==0) { val3=val1&val2; } else if(op2==1) { val3=val1|val2; } else if(op2==2) { val3=~val2; } else if(op2==3) { val3=val1^val2; } else if(op2==4) { val3=((val2>>6)?0:val1<<val2); } else { val3=((val2>>6)?0:val1>>val2); } memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3; } else if(op==5) //Calculate (+ - * / %) { //想要乘方的建议自己写一个快速幂, 应该是能写的 int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3; int op2 = (code[i]>>52)&15; if(op2==0) { val3=val1+val2; } else if(op2==1) { val3=val1-val2; } else if(op2==2) { val3=val1*val2; } else if(op2==3) { val3=(val2?val1/val2:0); } else { val3=(val2?val1%val2:0); } memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3; } else if(op==6) //Goto { int p=code[i]&65535; i = (code[i]>>56)&1 ? memory[p] : p; i = (i+N-1)%N; } else if(op==7) //If-goto (> < == >= <= !=) { int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ]; int op2 = (code[i]>>52)&15; bool flag; if(op2==0) { flag=(val1>val2); } else if(op2==1) { flag=(val1<val2); } else if(op2==2) { flag=(val1==val2); } else if(op2==3) { flag=(val1>=val2); } else if(op2==4) { flag=(val1<=val2); } else { flag=(val1!=val2); } if(flag) { i = (code[i]>>56)&1 ? memory[p3] : p3; i = (i+N-1)%N; } } else if(op==8) //x++ { int p=code[i]&65535; memory[ (code[i]>>56)&1 ? memory[p] : p ]++; } else if(op==9) //x-- { int p=code[i]&65535; memory[ (code[i]>>56)&1 ? memory[p] : p ]--; } else if(op==15) //Exit { break; } else { cout<<"\n\nError: Invalid code\n\n"; } } return 0; }
- 1
信息
- ID
- 1
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- 递交数
- 12
- 已通过
- 6
- 上传者
京公网安备 11011102002149号