ACM复习(2)1078 破密
来源:互联网 发布:ai软件 编辑:程序博客网 时间:2024/05/17 18:48
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 < P if(cur < pre) // M = C + 96 - P putchar(cur - pre + 128); else // M = C - P 或 M = 0 putchar(cur - pre + 32); } pre = cur; } printf("\n"); return 0;}
阅读全文
0 0
- ACM复习(2)1078 破密
- ACM复习(1)1077 韩信点兵
- ACM复习(6)1144 数星星
- ACM复习(7)1079 三角形
- ACM复习(11)8615 快乐
- ACM复习(13)8612 发牌
- ACM复习(14)8613 锁
- ACM复习(15)8614 素数
- [ACM] hdu 1465 不容易系列之一(错排复习)
- [ACM] POJ 1088 滑雪 (记忆化搜索复习)
- ACM复习(3)1139 约瑟夫环问题
- ACM复习(4)1142 巡逻的士兵
- ACM复习(5)1076 K尾相等数
- ACM复习(8)1143 多少个Fibonacci数
- ACM复习(9)8611 大牛之路I
- ACM复习(10)8619 公约公倍
- ACM复习(12)8618大牛之路II
- ACM复习(16)8617 阶乘数字和
- angular2如何识别字符串中的html标签,并按照html来显示视图
- c++ 三目运算符
- 3333-数据结构实验之栈与队列五:下一较大值(一)
- hive中的NULL(hive空值处理)
- #每天一点R语言# 简单运算
- ACM复习(2)1078 破密
- http 协议 基础
- Lifetime-Based Memory Management for Distributed Data Processing Systems
- LSH(局部敏感哈希算法)实现文本的相似性比对
- 输入一个字符串,找到其中最长的单词并输出
- scollrfresh
- 枚举常量
- Android屏幕适配实战
- epoll()详解