4112:情报破译-Cryptanalysis

题目:

描述

    A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:

1.    仅对字母加密,其他符号保留(如空格,逗号等)

2.    对第i个单词(i从1开始)的加密方法是把第i个单词反转(如abc变成cba),然后对单词内的每个字母采用经典的Caesar加密法,循环后移i个字母。例如:第5个单词的加密表如下所示:

密码字母:A B C D E F G H I J K L M N O P Q R S T U VW X Y Z

原文字母:V W X Y Z A B C D E F G H I J K L M N O P QR S T U

3.       单词的定义是:任何一串极大的连续字母串。

比如,样例输出第三行,第二个单词为ba,反转后为ab,a后移2个单词变成c,b后移两个单词变成d,故该单词加密后为cd(见样例输入第三行)。

现在A国又截获了一些B国的情报密文。请你帮A国破译出情报的内容。

输入

    一共有不超过int范围行,每行为一个字符串(int范围)。注意,每行是可以以空格开头的。

输出

     情报破译后得到的内容。每条情报对应输出一行。

样例输入:

fiU umncv oolz  ioex jhfqu,  zg uh zqI nlaxO  ockl yz kmpzgE.
fX gxcj , ghlsxffr cxmG K.
ab3cd

      样例输出:

The talks will  take place,  at an Air Force  base on Sunday.
We have , occupied City F.
az3ba


评价:

    
           比较水,就是麻烦。

代码:

#include 
#include
#include
using namespace std;
#define N 65536

int main()
{
    //freopen("1.txt","r",stdin);
    char ciphertext[N],temp[N] ;
    int i;
    char trans;
    long num,cir,tem,oppo;
    while(gets(ciphertext))
    {
        tem=0;
        i=1;
        num=strlen(ciphertext);
        for(cir = 0;cir='A'&&ciphertext[cir]<='Z')
            {
               trans = (ciphertext[cir]-'A'-(i)%26)%26;
               if(trans>=0) temp[tem]=trans+'A';
               else temp[tem] = trans+26+'A';
               tem++;
                if(cir+1==num)
                {
                    for(oppo=tem-1;oppo>=0;oppo--)
                    {
                        cout<='a'&&ciphertext[cir]<='z')
            {
                trans = (ciphertext[cir]-'a'-(i)%26)%26;
                if(trans>=0) temp[tem]=trans+'a';
                else temp[tem] = trans+26+'a';
                tem++;
                if(cir+1==num)
                {
                    for(oppo=tem-1;oppo>=0;oppo--)
                    {
                        cout<=0;oppo--)
                {
                    cout<


你可能感兴趣的:(北大百练)