本文主要是介绍ACM复习(2)1078 破密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
有一行英文密码,友军急切地想知道原文是什么,现知道加密的方法如下:
(1)第一个字母的密文与原文相同;
(2)从第二个字母开始,每一个字母的密文的ACSII码等于上一个字母的(密文的ACSII码-32)+(原文ACSII-32)的和
再与96取模(即取余数)最后加上32
现由键盘给出一行密文(最多不超过10000个字母),要求输出原文。
输入格式
一段密文(以EOF结束)
输出格式
明文
输入样例
W<(tXG5z&m\K/
输出样例
Welldone,good
解题思路
分析后可以得出如下公式:
[(pre - 32) + (m - 32)] % 96 + 32 = c
即:
[(pre - 32) + (m - 32)] % 96 = c - 32
可打印字符最大ASCii码为127,所以
[(pre - 32) + (m - 32)] < 96 * 2
pre - 32恒为已知,设为P。c - 32恒为已知,设为C。m - 32未知,设为M
得:
(P + M) % 96 = C
0 <= P + M < 96 * 2
当 C < P时:
(P + M) % 96 = =>(P + M) - 96
可得:
M = C + 96 - P
当C = P时:
已知 M = (m - 32) <= 127 - 32 = 95
可得:M = 0
当C > P时:
P + M = C
可得:
M = C - P
#include<stdio.h>
int main()
{char pre, cur;int flag = 0;while((cur = getchar()) != EOF){if(!flag){flag = 1;putchar(cur);}else{// C < Pif(cur < pre)// M = C + 96 - Pputchar(cur - pre + 128);else // M = C - P 或 M = 0putchar(cur - pre + 32);}pre = cur;}printf("\n");return 0;
}
这篇关于ACM复习(2)1078 破密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!