标签:ios ase compute stand desc span isp ott else
1 ADD R1,R2 0 0000010000100010 0 1111111111111111
0000010000100010 ADD R1,R2 Error!
题意:就是有6个操作,分别有相应的二进制编码表示,看上面的表,然后仅仅有1~31的数进行加减乘除,1用00001表示,31用11111表示
这里要你翻译编码的意思;比如例子1:
1
ADD R1,R2
1代表你要把Add换成000001 然后后面R1 1的编码 00001,R2的编码00010合起来就是 0000010000100010
第二组例子就是相反的意思
不得不说的是 一定要注意 SET 操作
好了,详细解释在代码中:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
using namespace std;
#define N 1005
char op[10][10]={"ADD","SUB","DIV","MUL","MOVE","SET"};
char opp[10][10]={"000001","000010","000011","000100","000101","000110"};
char e[33][10]={"00000","00001","00010","00011","00100", //请注意这个表非常好,就是假设相应00011,那么就是下标3
"00101","00110","00111","01000","01001",
"01010","01011","01100","01101","01110",
"01111","10000","10001","10010","10011",
"10100","10101","10110","10111","11000",
"11001","11010","11011","11100","11101",
"11110","11111"};
char a[N],b[N],c[N];
int fdd(char *a) //把Ra中的a取出来的函数
{
int i,temp=0;
int len=strlen(a);
for(i=1;i<len;i++)
temp=temp*10+a[i]-‘0‘;
return temp;
}
void solve()
{
int i,j,pos;
for(i=0;i<6;i++)
if(strcmp(a,opp[i])==0)
break;
pos=i;
if(i==6) //推断操作数是否合格
{
printf("Error!\n");
return ;
}
if(i==5) //假设是SET相应的000110 就单独处理
{
if(strcmp(c,e[0])!=0||strcmp(b,e[0])==0) //必须满足c串相应的是0而且b串相应的数!=0,否者Error
{
printf("Error!\n");
return ;
}
for(i=1;i<32;i++)
if(strcmp(b,e[i])==0)
break;
printf("SET R%d\n",i);
return ;
}
for(i=1;i<32;i++)
if(strcmp(b,e[i])==0)
break;
j=i;
for(i=1;i<32;i++)
if(strcmp(c,e[i])==0)
break;
if(i>=32||j>=32) //推断b,c串是否是e数组里的,换而言之是否合格(大于31就是不合格的)
{
printf("Error!\n");
return ;
}
printf("%s R%d,R%d\n",op[pos],j,i);
}
int main()
{
int i,j,x;
while(~scanf("%d",&x))
{
if(x==1)
{
scanf("%s%s",a,b);
if(strcmp(a,op[5])==0) //假设是SET单独处理
{
int pos=fdd(b);
printf("%s%s00000\n",opp[5],e[pos]);
continue;
}
int len=strlen(b); //分成3段 a b c 分别代表 哪一种操作,Ra Rb
for(i=0;i<len;i++)
if(b[i]==‘,‘)
break;
b[i]=‘\0‘;
j=0;
i++;
for(i;i<len;i)
c[j++]=b[i++];
c[j]=‘\0‘;
for(i=0;i<6;i++)
if(strcmp(a,op[i])==0)
break;
printf("%s",opp[i]);
int pos;
pos=fdd(b);
printf("%s",e[pos]);
pos=fdd(c);
printf("%s\n",e[pos]);
}
else
{
scanf("%s",a);
j=0;
for(i=6;i<=10;i++)
b[j++]=a[i];
j=0;
for(i;i<=15;i++)
c[j++]=a[i];
a[6]=‘\0‘;
b[5]=‘\0‘;
c[5]=‘\0‘;
solve();
}
}
return 0;
}
标签:ios ase compute stand desc span isp ott else
原文地址:http://www.cnblogs.com/blfbuaa/p/6691833.html