http://acm.hdu.edu.cn/showproblem.php?pid=5083
机器码和操作互相转化
注意SET还要判断末5位不为0输出Error
#pragma comment(linker, "/STACK:36777216") #pragma GCC optimize ("O2") #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <queue> #include <map> #include <iostream> #include <algorithm> using namespace std; #define RD(x) scanf("%d",&x) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define clr0(x) memset(x,0,sizeof(x)) #define eps 1e-9 const double pi = acos(-1.0); typedef long long LL; const int modo = 1e9 + 7; const int INF = 0x3f3f3f3f; const int maxn = 55,maxm = 1e4 + 5; string op[10] = {"","ADD","SUB","DIV","MUL","MOVE","SET"}; int real[26]; char s[maxn]; int getnum(int x,int y) { int ans = 0; for(int i = x;i <= y;++i){ ans += (s[i] - '0')<<(y-i); } return ans; } void print(int x,int len) { int ans[10],num = 0; while(x){ ans[num++] = x&1; x>>=1; } while(--len >= num) printf("0"); while(num){ printf("%d",ans[--num]); } return ; } int main(){ int _; for(int i = 1;i <= 6;++i){ real[op[i][op[i].length() - 1] - 'A'] = i; } //freopen("in.txt", "r", stdin); while(~scanf("%d",&_)){ if(_ == 0){ scanf("%s",s); int _op = getnum(0,5); if(_op >= 7 || _op <= 0){ printf("Error! "); continue; } if(_op == 6){ int x = getnum(6,10),y = getnum(11,15); if(!x || x > 31 || y != 0){ printf("Error! "); continue; } cout<<op[_op]; printf(" R%d ",x); } else{ int x = getnum(6,10),y = getnum(11,15); if(!x || !y || x > 31|| y > 31){ printf("Error! "); continue; } cout<<op[_op]; printf(" R%d,R%d ",x,y); } }else{ int __ = 0,_op,_a,_b; scanf("%s",s); _op = real[s[strlen(s) - 1] - 'A'];//cout<<s<<' '<<_op<<endl; if(_op == 6){ scanf(" R%d",&_a); print(_op,6),print(_a,5),print(0,5); puts(""); }else{ scanf(" R%d,R%d",&_a,&_b); print(_op,6),print(_a,5),print(_b,5); puts(""); } } } return 0; }