欧拉计划 17

2021-07-24  本文已影响0人  Plutorres

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;
}
上一篇下一篇

猜你喜欢

热点阅读