1 条题解
-
0
思路与算法
将密文字母与密钥字母都看成0至25的编号。第i个位置使用k[i mod |k|],减去其位移后加26取模,再以密文字母对应的大小写基准转回字符。
正确性说明
加密表是模26加法,因此减去同一密钥位移就是唯一逆运算。密钥周期下标与加密一致,大小写只决定输出基准,不参与位移,所以逐字符还原明文。
复杂度
读入和处理O(|k|+|s|)时间,存两个输入串O(|k|+|s|)空间;除输入输出外辅助O(1)。
易错点
密钥大小写不改变位移,输出须保留明文字母大小写。先加26防止负余数;字符均为题设英文字母,ctype调用落在合法ASCII范围。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { string k, s; cin >> k >> s; for (int i = 0; i < (int)s.size(); i++) { char base = isupper(s[i]) ? 'A' : 'a'; int v = tolower(k[i % k.size()]) - 'a'; s[i] = base + (s[i] - base - v + 26) % 26; } cout << s << '\n'; }
- 1