码迷,mamicode.com
首页 > 其他好文 > 详细

压 93/94 位打表

时间:2020-09-17 19:10:24      阅读:22      评论:0      收藏:0      [点我收藏+]

标签:长度   str   unsigned   编译   字符串拼接   har   关闭   rap   一段   

93 位打表介绍

\(93\) 位打表就是把要打表的数字转换成 \(93\) 进制, 以此来缩短打表部分的代码长度. 例如打表 unsigned int 型数字时, 可以用 \(\lceil\log_{93}{(2^{31}-1)}\rceil=5\) 个字符表示. 至于为什么是 93 位, 因为 char 类型里有 95 个可见字符, \(ASCII\)码从 \(32\)\(126\), 其中 \" 在字符串表示中会引起错误, 所以我们跳过这两个字符.

打表的时候可以直接把这些字符串拼接在一起, 然后以 \(5\) 的倍数访问对应位置.

const char s[] = {""};  //打表的内容

int dc(char c) {
    if (c > ‘\\‘) c--;
    if (c > ‘"‘) c--;
    return c - 32;
}
int wk(int _l, int _r) {
    int _res = 0;
    inc(i, _l, _r) _res = _res * 93 + dc(s[i]);
    return _res;
}

但是今天写这个的时候遇到了一个问题, 我打表的字符串中有一段 ??= 引起 trigraph 警告, 据大大介绍, 因为我们学校 \(oj\)-std=C++xx 编译, 所以没有关闭 trigraph. 解决方案: 1. 跳过 ?, 压 \(92\) 位, 毕竟想用 \(5\) 个字符表示 unsighed int 型的数只需要 \(\lceil\sqrt[5]{2^{31}-1}\rceil=74\) 进制; 2. 跟着编辑器警告把 ??X 处断开; 3. 使用 raw string literal, 既避免了 \(trigraph\), 还多了个 \ 来表示, 变成 \(94\) 位. 最后一种方案个人比较喜欢.

94 位打表代码

// 数据生成
char v[6];
char dc(int _n) {
    _n += 32;
    if (_n >= ‘"‘) _n++;
    return (char)_n;
}
void wk(int _n) {
    inc(i, 0, 4) {
        v[4 - i] = dc(_n % 94);
        _n /= 94;
    }
    inc(i, 0, 4) printf("%c", v[i]);
}

// 翻译字符
const char s[] = R"()";  //打表的内容
int dc(char c) {
    if (c > ‘"‘) c--;
    return c - 32;
}
int wk(int _l, int _r) {
    int _res = 0;
    inc(i, _l, _r) _res = _res * 94 + dc(s[i]);
    return _res;
}

大概是这个太简单了, 网上都找不到相关介绍, 那就让我来当老实人吧

压 93/94 位打表

标签:长度   str   unsigned   编译   字符串拼接   har   关闭   rap   一段   

原文地址:https://www.cnblogs.com/hs-zlq/p/13636320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!