确实题目虽然有点水,但是开始的时候好像还真的没有想到怎么提取出这个编号一不小心感觉可以可以用unsigned char 这种类型,直接转为16进制,但是之后发现虽然第一次在codeblock中还行,但是第二天尝试的时候还是出错了,DEV中没有问题,所以瞬间感觉自己的肯定不是标准答案,查询之后才感觉位运算终于在题目中能够运用上了
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int table[27] = { 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA, 0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBBF7, 0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6, 0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA, 0xCDDA,0xCDDA,0xCDDA,0xCEF4,0xD1B9, 0xD4D1,0xFFFF }; //注意题中没有关于i,u,v开头的拼音(因为拼音中没有以i,u,v开头的),所以用下一个值代替即可,最后边界用极大值代替 int search(int p) { for(int i = 0; i < 27; ++i) if(table[i] > p) return i-1; } int main() { int T; char buf[110]; scanf("%d", &T); while(T--) { scanf("%s", buf); int len = strlen(buf);//一个汉字占两个字节 for(int i = 0; i < len; i+=2) { int tmp1 = 0x000000ff & buf[i]; ///取第一个字节,因为temp1为32位整数,所以只需取出其低八位即可。 char字符只有一个字节 int tmp2 = 0x000000ff & buf[i+1]; ///取第二个字节。 int pos = search( (tmp1<<8) +tmp2);///组合成编码后在 编码表中查找。 printf("%c", 'A'+pos); } printf("\n"); } return 0; }
开始的时候自己写的代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<cmath> #define INF f0x3f3f3f3f using namespace std; int s[30]; void judgePrintf(unsigned char ch[],char table[]){ int i; for(int x=0;ch[x]!='\0';x+=2) { for(i=0;i<23;i++) if(ch[x]*1000+ch[1+x]<s[i]) break; cout<<table[i-1]; } cout<<endl; return ; } int main(){ int Count=0; char table[]="ABCDEFGHJKLMNOPQRSTWXYZ"; unsigned char ch1[100]="啊芭擦搭蛾发噶哈击喀垃妈拿哦啪期然撒塌挖昔压匝",temp[100]; for(int i=0;ch1[i]!='\0';i+=2){ s[Count++]=ch1[i]*1000+ch1[i+1]; } int n; cin>>n; for(int i=0;i<n;i++){ cin>>temp; judgePrintf(temp,table); } return 0; }
顺便说一下char和unsigned的区别,好像其他的什么大的区别也没有,就是char能表示-128~127, unsigned char没有符号位,因此能表示0~255