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 ", 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 ", 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 ", 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 ", 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 ", op[5], num[a], num[b]);
48 }
49 else if(strcmp(str, "SET") == 0){
50 scanf("%*c%d", &a);
51 printf("%06d%05d%05d ", 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! ");
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! ");
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! ");
81 continue;
82 }
83 if(c == 6 && b != 0){
84 printf("Error! ");
85 continue;
86 }
87 if(c == 6 && a != 0 && b == 0){
88 printf("%s R%d ", op2[c], a);
89 continue;
90 }
91 if(c > 0 && c < 6 && a != 0 && b != 0){
92 printf("%s R%d,R%d ", op2[c], a, b);
93 continue;
94 }
95 printf("Error! ");
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 ", 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 ", 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 ", 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 ", 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 ", op[5], num[a], num[b]);
48 }
49 else if(strcmp(str, "SET") == 0){
50 scanf("%*c%d", &a);
51 printf("%06d%05d%05d ", 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! ");
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! ");
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! ");
81 continue;
82 }
83 if(c == 6 && b != 0){
84 printf("Error! ");
85 continue;
86 }
87 if(c == 6 && a != 0 && b == 0){
88 printf("%s R%d ", op2[c], a);
89 continue;
90 }
91 if(c > 0 && c < 6 && a != 0 && b != 0){
92 printf("%s R%d,R%d ", op2[c], a, b);
93 continue;
94 }
95 printf("Error! ");
96 }
97 }
98 return 0;
99 }