您的位置:首页 > 其它

ZOJ 1006

2015-04-09 10:23 225 查看

问题:已知加密算法公式,由密文反推出明文。

思路:

读入密文字符串,求出长度n值,同时将密文数字码转换成密文数字码,利用ciphercode[i] = cipertext [i] - 'a' + 1,特殊字符空格和“.”单独处理;

读入KEY值(即公式中k值);

根据已知加密算法公式,由密文数字码反推出明文数字码,plaincode[ (k * i ) % n ] - i) =
ciphercode[i] + i,

当 ciphercode[i] + i = 0 或者 27 (即特殊字符空格和‘.’的数字码)时,单独处理,

当 ciphercode[i] + i >=28,则将( ciphercode[i] + i ) - 28,

当 ciphercode[i] + i在0~27之内,则plaintext[ (k * i ) %
n ] =( ciphercode[i] + i )  - 1+ 'a' , 此处需要类型转换,等号右边计算的结果需要整体转换成char型。

http://www.cnblogs.com/cszlg/p/3214757.html

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

const int SZ = 71;

int k;

int pc[SZ];

char ct[SZ], pt[SZ];

int main()

{

    while(scanf("%d", &k) && k)

    {

        scanf("%s", ct);

        int n = strlen(ct);

        for(int i = 0; ct[i] != '\0'; i++)

        {

            int cc;

            switch(ct[i])

            {

            case '_':

                cc = 0;

                break;

            case '.':

                cc = 27;

                break;

            default:

                cc = ct[i] - 'a' + 1;

            }

            int j = (k * i) % n;

            pc[j] = cc + i;

            while(pc[j] > 27)

                pc[j] -= 28;

            if(pc[j] == 0)

                pt[j] = '_';

            else if(pc[j] == 27)

                pt[j] = '.';

            else

                pt[j] = (char)(pc[j] + 'a' - 1);

        }

        pt
= '\0';

        printf("%s\n", pt);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: