zoukankan      html  css  js  c++  java
  • hnust 土豪金的加密解密

    问题 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]='';
        printf("%s
    ",c);
        return 0;
    }
    View Code
  • 相关阅读:
    【Apollo】Apollo 分布式部署
    【Spring】SpringBatch快速入门
    Nacos、Apollo、Spring Cloud Config微服务配置中心对比
    IDEA或Android Studio用书签功能标识代码 Stars
    Jetpack架构组件学习(0)——总结篇 Stars
    Android Studio导出APP的数据库db文件 Stars
    Jetpack架构组件学习(1)——LifeCycle的使用 Stars
    JavaFx Tooltip悬浮提示使用及自定义 Stars
    JavaFx WebView使用研究 Stars
    Jetpack架构组件学习(2)——ViewModel和Livedata使用 Stars
  • 原文地址:https://www.cnblogs.com/wandso/p/10062060.html
Copyright © 2011-2022 走看看