乘数密码
时间限制:
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
-
输入包含多组数据,不超过1000组。
这个题的题意不明,没说清楚具体怎么处理,调了好久才调过了.......题意应该说的是:ABCDEF....分别当成整数123456...来处理。
现在给出某个数乘上 k 后对 26 取余之后的结果,让你找到这个数,数据保证在一定范围内唯一....
没别的方法,只能进行暴力查找原来的那个数字,然后最后输出相应的结果.........
#include<stdio.h>
int k;
char change(char x)
{
x=x-'A';
for(int i=0;i<26;++i)//暴力查找
{
if(k*i%26==x)//是否满足
{
return i+'A';//注意返回字符型
}
}
}
void slove(char x[])
{
for(int i=0;x[i]!=0;++i)
{
x[i]=change(x[i]);//破解密码...
}
printf("%s\n",x);//输出....
}
int main()
{
char x[105];
while(~scanf("%s%d",x,&k))
{
slove(x);
}
return 0;
}