欧拉计划 17
2021-07-24 本文已影响0人
Plutorres
题目描述
英文表示 需要使用多少字母(不包括空格与连接符)
思路
一步步简化问题,先单独处理
三位数:
百位数字的长度 + 长度
非整百还需要加上 长度
两位数和一位数:
若小于 ,两个数位一起计算
否则拆成两个数位,分别计算所占长度
数组的设计和函数的写法有诸多取巧之处,自己都觉得很神奇
代码
#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;
}