美文网首页
欧拉计划 17

欧拉计划 17

作者: Plutorres | 来源:发表于2021-07-24 23:25 被阅读0次

    Number letter counts

    题目描述

    英文表示 [1, 1000] 需要使用多少字母(不包括空格与连接符)

    思路

    一步步简化问题,先单独处理 1000

    三位数:
    百位数字的长度 + handred 长度
    非整百还需要加上 and 长度

    两位数和一位数:
    若小于 20,两个数位一起计算
    否则拆成两个数位,分别计算所占长度

    数组的设计和函数的写法有诸多取巧之处,自己都觉得很神奇

    代码

    #include <cstdio>
    
    int a[28] = {0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3,  // // 第一行:[0, 10]
                    6, 6, 8, 8, 7, 7, 9, 8, 8, 6,  // 第二行:[11, 20]
                    6, 5, 5, 5, 7, 6, 6};  // 第三行:[30, 90]
    int d[3];
    int ans = 11; // one thousand
    
    void nex() {
        if (++d[0] < 10) return;
        d[0] = 0;
        if (++d[1] < 10) return;
        d[1] = 0;
        d[2]++;
    }
    
    int get() {
        int k = !!d[2] * 7 + a[d[2]];
        if (d[2] && (d[1] || d[0])) k += 3;
        
        if (d[1] <= 1) k += a[d[1] * 10 + d[0]];
        else k += a[20 - 2 + d[1]] + a[d[0]];
        return k;
    }
    
    int main() {
        for (int i = 0; i < 1000; i++, nex()) {
            ans += get();
        }
        printf("%d\n", ans);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:欧拉计划 17

          本文链接:https://www.haomeiwen.com/subject/cmasmltx.html