http://acm.hdu.edu.cn/showproblem.php?pid=5083
官方题解——》
1002 Instruction 先考虑编码,首先找到operation对应的编码,如果是SET就找后面的一个R后面跟着的数字a,令b=0,否则找后面第一个R后面的数字当作a,第二个R后面的数字当作b,最后依次输出operation二进制编码,a, b的二进制编码。 再说解码,先将前6位,中间5位和后面5位转化成十进制记为oid, a, b。如果oid<1||oid>6就是Error!,如果oid<6那么a,b都不能为0,如果oid==6那么a!=0&&b==0。其它情况都是Error!,最后按照oid,a,b输出指令即可。
下面来代码。。水平有限,比较丑,勿怪-_-|||
1 #include <stdio.h>
2 #include <
string.h>
3 #include <math.h>
4
5 int num[ 33] = {
6 0, 1, 10, 11, 100, 101, 110, 111,
7 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111,
8 10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111,
9 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111
10 };
11
12 int op[ 10] = {
13 0, 1, 10, 11, 100, 101, 110
14 };
15
16 char op2[ 7][ 6] = {
17 "", " ADD ", " SUB ", " DIV ", " MUL ", " MOVE ", " SET "
18 };
19
20
21
22
23 int main(){
24 int type, a, b, i, j, c;
25 char str[ 20];
26 while(scanf( " %d ", &type) != EOF){
27 if(type == 1){
28 scanf( " %s ", str);
29 if(strcmp(str, " ADD ") == 0){
30 scanf( " %*c%d,%*c%d ", &a, &b);
31 printf( " %06d%05d%05d\n ", op[ 1], num[a], num[b]);
32 }
33 else if(strcmp(str, " SUB ") == 0){
34 scanf( " %*c%d,%*c%d ", &a, &b);
35 printf( " %06d%05d%05d\n ", op[ 2], num[a], num[b]);
36 }
37 else if(strcmp(str, " DIV ") == 0){
38 scanf( " %*c%d,%*c%d ", &a, &b);
39 printf( " %06d%05d%05d\n ", op[ 3], num[a], num[b]);
40 }
41 else if(strcmp(str, " MUL ") == 0){
42 scanf( " %*c%d,%*c%d ", &a, &b);
43 printf( " %06d%05d%05d\n ", op[ 4], num[a], num[b]);
44 }
45 else if(strcmp(str, " MOVE ") == 0){
46 scanf( " %*c%d,%*c%d ", &a, &b);
47 printf( " %06d%05d%05d\n ", op[ 5], num[a], num[b]);
48 }
49 else if(strcmp(str, " SET ") == 0){
50 scanf( " %*c%d ", &a);
51 printf( " %06d%05d%05d\n ", op[ 6], num[a], num[ 0]);
52 }
53 }
54 else{
55 scanf( " %s ", str);
56 for(c = i = 0; i < 6; i++){
57 if(str[i] == ' 1 '){
58 c += ( int)pow( 2, 5 - i);
59 }
60 }
61 if(c > 6 || c == 0){
62 printf( " Error!\n ");
63 continue;
64 }
65 for(a = 0, i = 6; i < 11; i++){
66 if(str[i] == ' 1 '){
67 a += ( int)pow( 2, 10 - i);
68 }
69 }
70 if(a > 32 || a == 0){
71 printf( " Error!\n ");
72 continue;
73 }
74 for(b = 0, i = 11; i < 16; i++){
75 if(str[i] == ' 1 '){
76 b += ( int)pow( 2, 15 - i);
77 }
78 }
79 if(b > 32){
80 printf( " Error!\n ");
81 continue;
82 }
83 if(c == 6 && b != 0){
84 printf( " Error!\n ");
85 continue;
86 }
87 if(c == 6 && a != 0 && b == 0){
88 printf( " %s R%d\n ", op2[c], a);
89 continue;
90 }
91 if(c > 0 && c < 6 && a != 0 && b != 0){
92 printf( " %s R%d,R%d\n ", op2[c], a, b);
93 continue;
94 }
95 printf( " Error!\n ");
96 }
97 }
98 return 0;
99 }
3 #include <math.h>
4
5 int num[ 33] = {
6 0, 1, 10, 11, 100, 101, 110, 111,
7 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111,
8 10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111,
9 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111
10 };
11
12 int op[ 10] = {
13 0, 1, 10, 11, 100, 101, 110
14 };
15
16 char op2[ 7][ 6] = {
17 "", " ADD ", " SUB ", " DIV ", " MUL ", " MOVE ", " SET "
18 };
19
20
21
22
23 int main(){
24 int type, a, b, i, j, c;
25 char str[ 20];
26 while(scanf( " %d ", &type) != EOF){
27 if(type == 1){
28 scanf( " %s ", str);
29 if(strcmp(str, " ADD ") == 0){
30 scanf( " %*c%d,%*c%d ", &a, &b);
31 printf( " %06d%05d%05d\n ", op[ 1], num[a], num[b]);
32 }
33 else if(strcmp(str, " SUB ") == 0){
34 scanf( " %*c%d,%*c%d ", &a, &b);
35 printf( " %06d%05d%05d\n ", op[ 2], num[a], num[b]);
36 }
37 else if(strcmp(str, " DIV ") == 0){
38 scanf( " %*c%d,%*c%d ", &a, &b);
39 printf( " %06d%05d%05d\n ", op[ 3], num[a], num[b]);
40 }
41 else if(strcmp(str, " MUL ") == 0){
42 scanf( " %*c%d,%*c%d ", &a, &b);
43 printf( " %06d%05d%05d\n ", op[ 4], num[a], num[b]);
44 }
45 else if(strcmp(str, " MOVE ") == 0){
46 scanf( " %*c%d,%*c%d ", &a, &b);
47 printf( " %06d%05d%05d\n ", op[ 5], num[a], num[b]);
48 }
49 else if(strcmp(str, " SET ") == 0){
50 scanf( " %*c%d ", &a);
51 printf( " %06d%05d%05d\n ", op[ 6], num[a], num[ 0]);
52 }
53 }
54 else{
55 scanf( " %s ", str);
56 for(c = i = 0; i < 6; i++){
57 if(str[i] == ' 1 '){
58 c += ( int)pow( 2, 5 - i);
59 }
60 }
61 if(c > 6 || c == 0){
62 printf( " Error!\n ");
63 continue;
64 }
65 for(a = 0, i = 6; i < 11; i++){
66 if(str[i] == ' 1 '){
67 a += ( int)pow( 2, 10 - i);
68 }
69 }
70 if(a > 32 || a == 0){
71 printf( " Error!\n ");
72 continue;
73 }
74 for(b = 0, i = 11; i < 16; i++){
75 if(str[i] == ' 1 '){
76 b += ( int)pow( 2, 15 - i);
77 }
78 }
79 if(b > 32){
80 printf( " Error!\n ");
81 continue;
82 }
83 if(c == 6 && b != 0){
84 printf( " Error!\n ");
85 continue;
86 }
87 if(c == 6 && a != 0 && b == 0){
88 printf( " %s R%d\n ", op2[c], a);
89 continue;
90 }
91 if(c > 0 && c < 6 && a != 0 && b != 0){
92 printf( " %s R%d,R%d\n ", op2[c], a, b);
93 continue;
94 }
95 printf( " Error!\n ");
96 }
97 }
98 return 0;
99 }