You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效完成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:54:03