题解 | #字符串加解密# (核心5行,简单好懂)
看了一些题解,要不直接翻译密码……(那还让你算什么),要不写一大堆,就把自己的发出来吧
核心逻辑是对每个字符进行偏移,通过取余来保证不会越界,所有的偏移都向右进行,保证取余数之后一定是正数
加密的时候字母和数字都向右偏移1位,解密的时候字母向右偏移25位(向左1位)数字向右偏移9位(向左1位)
以数字为例(第8行),对每个数字,增加偏移之后计算和'0'的差值,将这个差值对10取余数,这样就不会越界
比如字符'5'此时变成了数字6,字符'9'就变成了数字0
最后加上字符'0',把数字还原回字符,上面的数字6就变成了字符'6',数字0就变成了字符'0'
#include <iostream> #include <string> using namespace std; string f1(string s, int offset_alpha, int offset_digit) { for (auto &c : s) if (isdigit(c)) c = (c + offset_digit - '0') % 10 + '0'; else c = (c + offset_alpha - (isupper(c) ? 'A' : 'a')) % 26 + (isupper(c) ? 'a' : 'A'); return s; } int main() { string s, t; getline(cin, s); getline(cin, t); cout << f1(s, 1, 1) << endl; cout << f1(t, 25, 9) << endl; return 0; }