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 < 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值