描述
乘数密码也是一种替换密码,其加密变换是将明文字母串逐位乘以密钥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
来源
题意应该说的是:ABCDEF....分别当成整数123456...来处理。现在给出某个数乘上 k
后对 26 取余之后的结果,让你找到这个数,数据保证在一定范围内唯一....没别的
方法,只能进行暴力查找原来的那个数字,然后最后输出相应的结果.........
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int q = 26;
char wzz(char c,int k)
{
c = c - 'A';
for (int i=0;i<26;i++)
if (i*k%q==c)
c = i + 'A';
return c;
}
int main()
{
int k;
char s[55];
while(scanf("%s %d",s,&k)!=EOF)
{
for (int i=0;s[i]!='\0';i++)
s[i] = wzz(s[i],k);
printf("%s\n",s);
}
return 0;
}