欧拉计划 17

Number letter counts

题目描述

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

思路

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

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

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

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

代码

#include 

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)