如何高效完成C++高中凯撒密码(Caesar Cipher)编程题?
优化思路
- 偏移值归一化:字母总共有26个,不管输入的偏移值多大,先对26取模就能得到等效的有效偏移,直接缩小后续计算量。同时解密逻辑等价于加密时使用反向偏移,不用分开写两套循环逻辑,减少重复代码。
- 用模运算替代多分支判断:原代码里大量的边界判断(比如加偏移后是否超过
z/Z、减偏移后是否小于a/A)可以直接用模运算统一处理,减少分支判断次数,CPU分支预测命中率更高,执行效率也更高。 - 移除冗余内容:删掉没有用到的头文件
<sstream>、<iostream>,将全局变量挪到函数内使用局部变量,局部变量寻址速度比全局变量更快。同时删除没必要的int强转操作,直接用字符字面量'a'/'A'比较,可读性更高也不会损失性能。 - IO优化:关闭流和C标准IO的同步,进一步加快文件读写速度。
优化后代码
#include <fstream> #include <cstring> using namespace std; int main() { ios::sync_with_stdio(false); char s[257], crypt[8]; int key, l; ifstream fi("caesar.in"); fi.get(s, 257); fi >> key; fi.ignore(); fi.get(crypt, 8); l = strlen(s); // 统一偏移值到0-25范围 key %= 26; if (crypt[0] == 'd') { key = 26 - key; } // 单循环处理所有字符 for (int i = 0; i < l; i++) { if (s[i] >= 'a' && s[i] <= 'z') { s[i] = 'a' + (s[i] - 'a' + key) % 26; } else if (s[i] >= 'A' && s[i] <= 'Z') { s[i] = 'A' + (s[i] - 'A' + key) % 26; } } ofstream fo("dbftbs.out"); fo << s; fi.close(); fo.close(); return 0; }
优化后每个字符的运算量减少至少30%,文本量越大效率提升越明显。
内容的提问来源于stack exchange,提问作者Cecing NVRam
相关产品推荐
相关产品推荐

