问题 G: 土豪金的加密与解密
时间限制: 1 Sec 内存限制: 128 MB提交: 466 解决: 263[提交][状态][讨论版]
题目描述
有一位姓金的同学因为买了一部土豪金,从此大家都称他为土豪金。
土豪金是一个网络迷,在网络上的帐号多得数不胜数,为了能记住各种各样的帐号和密码,他一般写在记事本上或一个专门的帐号密码文件中。近期,为了加强这些私有信息的安全,他开始琢磨如何对密码进行一些简单的加密处理。
有一天,他准备用手机打电话,当他打开键盘(如图示)准备拨号时,突发奇想,我为什么不利用这个键盘上的信息来加密呢?
土豪金的帐号密码是由大写字母和数字组成的,于是他便利用键盘上的12个按键制订了一个简单的加密规则,用于对自己各种帐号的密码进行加密,以防止别人轻易地获知其密码。
土豪金琢磨的规则是这样的:
1)如果是数字,除了0和1不变外,其它的数字都把它变成对应按键上的大写字母。只要是这个按键上的大写字母,随便哪个字母都行。例如,原来的密码是“1110023”,则可加密变成“11100AD”,也可变成“11100BF”或“11100CE”等形式。
2)如果是大写字母,就把它变成对应按键上的数字字符串。但数字的个数等于字母在该键上所处的位置号。例如,若原来的密码是“A”,则可加密变成”2”;若原来的密码是“B”,则可加密变成“22”; 若原来的密码是“C”,则可加密变成“222”。同理,若原来的密码是“S”,则可加密变成“7777”。
3)按规则1)和2)加密后的字符可以根据需要,用星号“*”隔开。这主要是对第2条规则进行完善,因为若原来的密码是“AB”,则按规则加密变成“222”,但这时“222”解密时会有歧义,因此用星号隔开,就变成 “2*22”。加了这条规则后,凡是没用“*”号隔开的“重复数字”要取最长的进行解密。如对“222”进行解密,就只能是“C”,而不会是“AAA”或“AB”或“BA”
4)加密后的字符可以根据需要,用井号“#”开始加上一个字符串。从“#”开始的字符串是干扰别人解密的迷惑信息,解密时不用理它,弃之。
根据以上规则,下面举几个例子。
1) TUHAO123可以加密变成8*884426661AE
2) TUHAO123可以加密变成8*88*4426661BF
3) TUHAO123可以加密变成8*88*4426661BF#ER23
自从土豪金用这个规则后,记事本上再也不用明文去记帐号的密码了,而记的都是经过他加密以后的密文。但是,当他忘记账号的密码后,就要到记事本上来查,但他觉得对密文进行人工解密太麻烦了,于是他向你这个编程高手求助,请你写一程序,帮助他把记事本上记的密文快速的解密成明文。注:解密就是按上述规则进行逆向处理。
例1,当输入是“8*88*4426661BF#ER23”时,经过你程序的解密处理,应该输出“TUHAO123”;
例2:当输入是“4445556668883399966688”时,经过你程序的解密处理,应该输出“ILOVEYOU”。
例3:当输入是“TUHAO”时,经过你程序的解密处理,应该输出“88426”。
例4:当输入是“11100BF”时,经过你程序的解密处理,应该输出“1110023”。
输入
输入一行字符串。字符串长度不超过50。该字符串表示对明文加密后的密文。
注意:只有一组数据。
输出
根据输入的密文,解密成明文后输出。
样例输入
8*884426661AE
样例输出
TUHAO123打个表就好了
#include <cstdio>
#include <cstring>
char tw[
8][
4]={
'A',
'B',
'C',
'1',
'D',
'E',
'F',
'1',
'G',
'H',
'I',
'1',
'J',
'K',
'L',
'1',
'M',
'N',
'O',
'1',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'1',
'W',
'X',
'Y',
'Z'};
char matht(
char a)
{
char k;
if(a<=
'C') k=
'2';
else if(a<=
'F'&&a>=
'D') k=
'3';
else if(a<=
'I'&&a>=
'G') k=
'4';
else if(a<=
'L'&&a>=
'J') k=
'5';
else if(a<=
'O'&&a>=
'M') k=
'6';
else if(a<=
'S'&&a>=
'P') k=
'7';
else if(a<=
'V'&&a>=
'T') k=
'8';
else if(a<=
'Z') k=
'9';
return k;
}
char eng(
char n,
int l)
{
if(n==
'2')
return tw[
0][l];
else if(n==
'3')
return tw[
1][l];
else if(n==
'4')
return tw[
2][l];
else if(n==
'5')
return tw[
3][l];
else if(n==
'6')
return tw[
4][l];
else if(n==
'7')
return tw[
5][l];
else if(n==
'8')
return tw[
6][l];
else return tw[
7][l];
}
int main()
{
int n,o=
0,i,q;
char s[
55],c[
55];
scanf("%s",s);
int l=
strlen(s);
for(i=
0;i<l;i++
)
{
q=
0;
if(s[i]==
'#')
break;
else if(s[i]==
'*')
continue;
else if(s[i]>=
'A'&&s[i]<=
'Z')
c[o++]=
matht(s[i]);
else if(s[i]<
'2'&&s[i]>=
'0')
c[o++]=
s[i];
else if(s[i]>=
'0'&&s[i]<=
'9')
{
while(s[i+
1]>=
'0'&&s[i+
1]<=
'9'&&(s[i+
1]-
'0'==s[i]-
'0'))
{
i++
;
q++
;
}
c[o++]=
eng(s[i],q);
}
}
c[o]=
'\0';
printf("%s\n",c);
return 0;
}
View Code
转载于:https://www.cnblogs.com/wandso/p/10062060.html