码迷,mamicode.com
首页 > 其他好文 > 详细

nyoj769乘数密码

时间:2016-05-13 02:21:12      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

乘数密码

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述

乘数密码也是一种替换密码,其加密变换是将明文字母串逐位乘以密钥k并进行模运算,数学表达式如下:

E(m)=k*m mod q,   gcd(k,q)=1 (即k,q互素)。

当k与q互素时,明文字母加密成密文字母的关系为一一映射。

现有一经过乘法加密的密文,请破译出它的明文。

输入
输入包含多组数据,不超过1000组。
每组包含一个字符串和一个正整数k,字符串全部由大写字母组成,长度不超过50,k是与q互素的数,q=26,k<26。
输出
每组输出数据单独占一行,输出对应的明文。
样例输入
ILOVEYOU 3
样例输出
UVWHKIWY

题意:这个题看了很久才看懂题意,意思是给你一个k值,每一个字母都根据k和给出的公式进行了加密,那么现在要解密输出明文。

思路:也就是一个逆向的过程。首先为了方便我们先把A~Z的ascll码编程0~26,那么我们首先将明文转换为暗文用数组记录每一个对应关系,

但存的时候我们是将暗文用下标保存,明文用下标对应的值保存,这样一来输入给出暗文,我们根据数组就可以输出对应的明文。也就完成了解密的过程。


Code:

#include <stdio.h>
#include <string.h>

char str[50],ch[50];

void mapping(int k)     //建立明文与暗文的映射
{
    int i;
    for(i=0;i<26;i++)
        ch[i*k%26]=i+'A';       //ch的坐标为暗文,其对应值为明文
}

int main()
{
    int k,i;
    while(scanf("%s%d",str,&k)!=EOF)
    {
        mapping(k);
        for(i=0;i<strlen(str);i++)
            str[i]=ch[str[i]-'A'];      //直接用暗文下标找到对应的明文
        printf("%s\n",str);
    }
    return 0;
}



nyoj769乘数密码

标签:

原文地址:http://blog.csdn.net/sxx312/article/details/51345853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!