UVa 458 The Decoder

UVa 458 The Decoder

题目描述

题目要求解码一个简单的字符替换密码。编码方式是对每个可打印ASCII\texttt{ASCII}ASCII字符进行统一的算术变换。从样例可以看出,编码字符与解码字符之间相差固定值(777)。例如,输入中的1对应输出中的*ASCII\texttt{ASCII}ASCII494949424242,差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后输出,换行符直接输出。

验证

  • 输入1ASCII\texttt{ASCII}ASCII494949)→ 输出*ASCII\texttt{ASCII}ASCII424242),差777
  • 输入JASCII\texttt{ASCII}ASCII747474)→ 输出CASCII\texttt{ASCII}ASCII676767),差777
  • 输入KASCII\texttt{ASCII}ASCII757575)→ 输出DASCII\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;}