欧拉计划 17

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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Amicable numbers[https://projecteuler.net/problem=21] 题目描...
    Plutorres阅读 2,701评论 0 0
  • 第五章******************************************************...
    fastwe阅读 3,989评论 0 0
  • 本文刊载于《上海财经大学博物馆馆刊》2018年11月(第一期),网络版为《机械之美——机械时期的计算设备》。 所谓...
    逸之阅读 7,376评论 0 10
  • 机械时期(17世纪初~19世纪末) 手动时期的计算工具通常没有多少复杂的制作原理,许多经典的计算工具之所以强大,譬...
    逸之阅读 54,893评论 65 275
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 127,300评论 2 7