• P1079Vigenère密码


    这是2012年noip提高组的的DAY1T1,我用了一下午的时间,一次性AC^^。

    这是一个字符串的模拟题。首先给出了一个密码对应法则,我们发现在同一对角线的明文通过密钥得出来的密文是相同的。根据八皇后,我们可得i+j相同的则为同一个密文。然后可以把序号改成asscii的话,密文-密钥=明文+A/a,这里我是通过强制转成int再转回char实现的。然而第一次我想通过打表来做。那么第二个问题则是要把密钥的长度填充到和明文长度相同,我选用了while嵌套来for密钥以此达到相同长度。第三点则是有小写和大写输出之分,先写一个judge函数判断,分成全大,全小,一大一小(两种)。然后再根据要求一点点写吧~那么这个地方有一个问题,那么就是: 密文是A,密钥Z,这种情况就出现了负数,然后我们就手推几组数据得到+26即可,相当于一个来回。另外一大一小时要先开变量去转换。通过一次次的调试,终于过样例了了,样例答案是这样的:Where is a will,there is a will.

    1.做题时一心一意,别乱下位玩,很浪费时间,虽然题太难时坐立不安。

    2.写程序时可以再新建一个,用来测试,或者找asscii码等

    3.再次说手推样例很重要,一定要心平气和地算。

    4.学会类比,比如这个对角线可以类比八皇后,强转换再类比那天机房考试的密码题

    5.调试的过程中一定要有信念,出现问题也一定要有决心去解决

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    string k,c;
    char kk[10001],cc[10001];
    bool judge(char x){//判断是否是大写 
        if(int(x)>=65&&int(x)<=90){
            return true;
        }
        else return false;
    } 
    int main(){
        cin>>k;//秘钥 
        cin>>c;//明文加密后的密文 
        int len=c.length();
        int len_k=k.length();
        int n=1;
        while(n<=len){//把密钥填充满 
            for(int i=0;i<=len_k-1;i++){
                kk[n]=k[i];
                n++;
            }
        }
        for(int i=0;i<=len-1;i++){//将最后的密文转成数组 
            cc[i+1]=c[i];
        }
    /*    for(int i=1;i<=len;i++){
            cout<<kk[i]<<" "<<cc[i]<<endl;;
        }*/    
        //cout<<endl;
        for(int i=1;i<=len;i++){    
            int  ques=0;
            if(judge(cc[i])==true&&judge(kk[i])==true){//全是大写的
                if(int(cc[i])-int(kk[i])>=0){
                ques=int(cc[i])-int(kk[i])+65;
                cout<<char(ques);
                }
                else{
                    ques=int(cc[i])-int(kk[i])+65+26;
                    cout<<char(ques);
                }
            }    
            else if(judge(cc[i])==true&&judge(kk[i])==false){//密文是大写,密钥是小写,还是输出大写
                int kkk=int(kk[i])-32;
                int ccc=int(cc[i]);
                if(ccc-kkk>=0){
                    ques=ccc-kkk+65;
                    cout<<char(ques);
                }
                else{
                ques=ccc-kkk+26+65;    
                cout<<char(ques);
                }                        
            }
            else if(judge(cc[i])==false&&judge(kk[i])==true){//密文是小写,密钥是大写,输出小写
                int kkk=int(kk[i])+32;
                int ccc=int(cc[i]);
                if(ccc-kkk>=0){
                    ques=ccc-kkk+97;
                    cout<<char(ques);
                }
                else{
                    ques=ccc-kkk+26+97;
                    cout<<char(ques);
                }
            }    
            else if(judge(cc[i])==false&&judge(kk[i])==false){//两个都是小写
                if(int(cc[i])-int(kk[i])>=0){
                ques=int(cc[i])-int(kk[i])+97;
                cout<<char(ques);                
                }
                else{
                    ques=int(cc[i])-int(kk[i])+97+26;
                    cout<<char(ques);
                }
            }
        }
        return 0;
    } 
  • 相关阅读:
    java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
    bulid path 引 jar包 步骤
    eclipse 报错
    PLSQL使用技巧
    Oracle sqlplus不是内部或外部命令
    SVN 插件安装到Myeclipse10 上(经典)
    socket学习
    Eclipse 配置 插件svn 包步骤
    如何在Eclipse中使用SVN(经典)
    linux 下搭建LAMP
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11311483.html
Copyright © 2020-2023  润新知