1 条题解
-
2
这道题代码不难,主要就if语句。 这里就讲解出明文的部分,即:
if (cnow > know) ans += cnow - know + a; else if (cnow == know) ans += a; else ans += ('z' - know + 1) + (cnow - 'a') + a;
可以看出我分成了3种情况:
1.密文当前位>密钥当前位。
这种情况说明没有开启新一轮(例xyzabcd属于开启了新一轮)直接cnow - know + a即可。
2.密文当前位=密钥当前位。 哪个字母与任意一个字母进行R运算还等于那个字母呢?那就只有A了。因此ans += a。
3.密文当前位<密钥当前位。 这种比较复杂,因为它开启了新一轮,所以我把它分成了2部分,前一轮(即……z)与后一轮(即a……),分别为('z' - know + 1)与(cnow - 'a'),最后求和即可。 上完整代码:
#include <bits/stdc++.h> using namespace std; /* k为密钥 c为密文 cpos存储c当前下标 kpos存储k当前下标 a存储字母模式(大小写) know存储k当前值 cnow存储c当前值 */ int main() { string k , c , ans; int kpos = 0; cin >> k >> c; for (int cpos = 0 ; cpos < c.length() ; cpos++) { //将know与cnow统一成一种模式 char a = 'a' , know = k[kpos] - 'A' + 'a' , cnow = c[cpos] - 'A' + 'a'; if (k[kpos] >= 'a' && k[kpos] <= 'z') know = k[kpos]; if (c[cpos] >= 'a' && c[cpos] <= 'z') cnow = c[cpos]; //判断此位模式 if (c[cpos] >= 'A' && c[cpos] <= 'Z') a = 'A'; //解出此位 if (cnow > know) ans += cnow - know + a; else if (cnow == know) ans += a; else ans += ('z' - know + 1) + (cnow - 'a') + a; //k下标变化 kpos++; kpos %= k.length(); } cout << ans; return 0; }
- 1
信息
- ID
- 1485
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 42
- 已通过
- 31
- 上传者