假设电报中用点(.)表示1,用中划线(-)表示0,点与中划线的序列,能够翻译成一个二进制数(可以看做无符号数)。将此二进制转换为整数后,通过一个映射表,可以将整数映射成一个英文字母。多个点、中划线序列间,用#隔开(多个连续的#号,算作一个#号),表示多个英文字母。
当电报中没有点、中划线,只有#时,电报内容为空字符串。
每个点、中划线序列,可以看做是无符号数。如果有点、中划线序列的二进制值超出如下映射表的范围,则输出”ERROR”。
映射表:
请将输入的点、中划线序列集合,转换为英文字母集合。
输入描述:
由点(.)、中划线(-)、#集合构成的原始报文。输出描述:
经过转换后生成的英文字符序列(英文区分大小写)
二进制值超出如下映射表的范围,则输出”ERROR”
示例1
输入
复制
--.#.#-.-
输出
复制
GGR
C++代码:
#include
#include
#include
char NumToInt(unsigned int number)
{
char map[] = { 'F', 'G', 'R', 'S', 'T', 'L', 'M', 'N', 'O', 'P', 'Q',\
'W', 'X', 'Y', 'Z', 'U', 'A', 'G', 'H', 'I', 'J', 'K',\
'B', 'C', 'D', 'E', 'l', 'm', 'n', 'o', 'p', 'i', 'j', 'k', 'f', 'g', 'h',\
'a', 'b', 'c', 'd', 'e', 'q', 'r', 'w', 'x', 'y', 'z', 's', 't', 'u', 'v' };
return map[number];
}
bool anylise(std::vector value, char &character)
{
if (value.size() == 0)
return true;
unsigned int result=0;
for (unsigned int i = 0; i < value.size(); i++)
{
result += value[i] << (2, value.size() - i-1);
}
if (result > 52 )
return false;
character = NumToInt(result);
return true;
}
void test(const char* str, unsigned int len)
{
int count = 0; //num of #
std::vector num;
for (unsigned int i = 0; i < len; i++)
{
switch (str[i])
{
case '.':
num.push_back(1);
count = 0;
break;
case '-':
num.push_back(0);
count = 0;
break;
case '#':
if (count == 0 && num.size() >0)
{
char character = ' ';
bool success = anylise(num, character);
num.clear();
if (success)
std::cout << character;
else
std::cout << "ERROR";
count++;
}
break;
default:
break;
}
}
char cha = ' ';
bool success = anylise(num, cha);
num.clear();
if (success)
std::cout << cha;
else
std::cout << "ERROR";
}
int main(int argc, char** argv)
{
std::string s("--.");
test(s.c_str(), s.length());
return 0;
}