UVa 458 The Decoder
题目描述
题目要求解码一个简单的字符替换密码。编码方式是对每个可打印ASCII\texttt{ASCII}ASCII字符进行统一的算术变换。从样例可以看出,编码字符与解码字符之间相差固定值(777)。例如,输入中的1对应输出中的*(ASCII\texttt{ASCII}ASCII码494949和424242,差777)。因此,解码只需将每个字符的ASCII\texttt{ASCII}ASCII码减去777即可。
输入格式
输入包含若干行,每行是一个编码后的字符串。输入以文件结束符(EOF\texttt{EOF}EOF)终止。
输出格式
输出解码后的字符串,保持原行结构。
样例
输入
1JKJ'pz'{ol'\{yhklthy'r'vm'{ol'Jvu{yvs'Kh{h'Jyywyh{pvu5 1PIT'pz'h'\{yhklthy'r'vm'{ol'Pu{lyuh{pvuhs'I|zpulzz'Thjopul'Jyywyh{pvu5 1KLJ'pz'{ol'\{yhklthy'r'vm'{ol'Kpnp{hs'Lx|pwtlu'Jyywyh{pvu5输出
*CDC is the trademark of the Control Data Corporation. *IBM is a trademark of the International Business Machine Corporation. *DEC is the trademark of the Digital Equipment Corporation.题目分析
本题的核心是发现编码与解码之间的映射规律。从样例可以推断,每个字符的ASCII\texttt{ASCII}ASCII码减去777即为解码后的字符。因此,逐字符读取输入,对每个非换行符减去777后输出,换行符直接输出。
验证
- 输入
1(ASCII\texttt{ASCII}ASCII494949)→ 输出*(ASCII\texttt{ASCII}ASCII424242),差777。 - 输入
J(ASCII\texttt{ASCII}ASCII747474)→ 输出C(ASCII\texttt{ASCII}ASCII676767),差777。 - 输入
K(ASCII\texttt{ASCII}ASCII757575)→ 输出D(ASCII\texttt{ASCII}ASCII686868),差777。 - 其他字符同理。
实现方法
- 使用
cin.unsetf(ios::skipws)禁止跳过空白字符,以便读取空格和换行符。 - 逐字符读取,遇到换行符输出换行,否则输出
char(letter - 7)。
复杂度分析
每个字符处理一次,时间复杂度O(L)O(L)O(L),LLL为输入总长度。
代码实现
// The Decoder// UVa ID: 458// Verdict: Accepted// Submission Date: 2016-07-12// UVa Run Time: 0.010s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);cin.unsetf(ios::skipws);charletter;while(cin>>letter){if(letter!='\n')cout<<(char)(letter-7);elsecout<<letter;}return0;}