【问题3】
本问题中,我们用以下的编码表示一定范围内的整数:
- 10〜35:以大写英文字母A至Z表示;
- 0〜9:以字符’0’至’9’表示;
- -1〜-10:分别以!@#$%?&*()表示;
- -11〜-36:以小写英文字母a至z表示;
这样一来,这些整数均可以由单个字符表示。
如,数列[0,35,18, 2]便可表示为0Zh@。
前者书写时需要8个字符(不含括号、逗号),后者只需4个字符。
上山容易下山难。你在自己的硬盘里翻出了一段以这种格式编码的数据,你希望将这些数据复原。
请编写程序完成这件事。
【输入形式】
输入一行,是一个字符串,表示压缩后的数据。该字符串满足以下三个条件:
(1)不为空。
(2)仅包含题目中的编码字符。
(3)长度不超过10000。
【输岀形式】
输出共2行。
第一行1个正整数n,表示数据个数。
第二行n个以空格分隔的整数a1,a2,…,an,表示复原的结果。
【样例输入】
0Zh@
【样例输出】
4
0 35 -18 -2
【样例说明】
字符串长度为4,对应编码4个数字,第一行输出4。
第二行依次输出4个整数,空格分隔:第一个字符0对应数字0,第二个大写字母Z对应35,第三个小写字母h对应-18,最后的@对应-2 。
【评分标准】
根据输入要求输出指定的结果,提交程序名为:code.c。
暴力代码:
#include<stdio.h>
int turn(char x){
switch(x){
case 'A':
return 10;
break;
case 'B':
return 11;
break;
case 'C':
return 12;
break;
case 'D':
return 13;
break;
case 'E':
return 14;
break;
case 'F':
return 15;
break;
case 'G':
return 16;
break;
case 'H':
return 17;
break;
case 'I':
return 18;
break;
case 'J':
return 19;
break;
case 'K':
return 20;
break;
case 'L':
return 21;
break;
case 'M':
return 22;
break;
case 'N':
return 23;
break;
case 'O':
return 24;
break;
case 'P':
return 25;
break;
case 'Q':
return 26;
break;
case 'R':
return 27;
break;
case 'S':
return 28;
break;
case 'T':
return 29;
break;
case 'U':
return 30;
break;
case 'V':
return 31;
break;
case 'W':
return 32;
break;
case 'X':
return 33;
break;
case 'Y':
return 34;
break;
case 'Z':
return 35;
break;
case '0':
return 0;
break;
case '1':
return 1;
break;
case '2':
return 2;
break;
case '3':
return 3;
break;
case '4':
return 4;
break;
case '5':
return 5;
break;
case '6':
return 6;
break;
case '7':
return 7;
break;
case '8':
return 8;
break;
case '9':
return 9;
break;
case '!':
return -1;
break;
case '@':
return -2;
break;
case '#':
return -3;
break;
case '$':
return -4;
break;
case '%':
return -5;
break;
case '?':
return -6;
break;
case '&':
return -7;
break;
case '*':
return -8;
break;
case '(':
return -9;
break;
case ')':
return -10;
break;
case 'a':
return -11;
break;
case 'b':
return -12;
break;
case 'c':
return -13;
break;
case 'd':
return -14;
break;
case 'e':
return -15;
break;
case 'f':
return -16;
break;
case 'g':
return -17;
break;
case 'h':
return -18;
break;
case 'i':
return -19;
break;
case 'j':
return -20;
break;
case 'k':
return -21;
break;
case 'l':
return -22;
break;
case 'm':
return -23;
break;
case 'n':
return -24;
break;
case 'o':
return -25;
break;
case 'p':
return -26;
break;
case 'q':
return -27;
break;
case 'r':
return -28;
break;
case 's':
return -29;
break;
case 't':
return -30;
break;
case 'u':
return -31;
break;
case 'v':
return -32;
break;
case 'w':
return -33;
break;
case 'x':
return -34;
break;
case 'y':
return -35;
break;
case 'z':
return -36;
break;
}
}
int main(){
char c[10000]={'0'};
int sum=0;
scanf("%s",&c);
int end[10000]={0};
while(c[sum]!='\0'){//记住符号串结尾是\0;
end[sum]=turn(c[sum]);
sum++;
}
printf("%d\n",sum);
for(int i=0;i<sum;i++){
printf("%d ",end[i]);
}
}