Project Euler Problem 17
If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 lette
Solution
Answer: 21124
We count the letters used when writing every number from $1$ to $1000$ in words (British usage), ignoring spaces and hyphens.
For example:
- $342 =$ “three hundred and forty-two”
$$5+7+3+5+3+5 = 23$$
- $115 =$ “one hundred and fifteen”
$$3+7+3+7 = 20$$
Step 1: Basic word lengths
Numbers $1$–$19$:
| Number | Word | Length |
|---|---|---|
| 1 | one | 3 |
| 2 | two | 3 |
| 3 | three | 5 |
| 4 | four | 4 |
| 5 | five | 4 |
| 6 | six | 3 |
| 7 | seven | 5 |
| 8 | eight | 5 |
| 9 | nine | 4 |
| 10 | ten | 3 |
| 11 | eleven | 6 |
| 12 | twelve | 6 |
| 13 | thirteen | 8 |
| 14 | fourteen | 8 |
| 15 | fifteen | 7 |
| 16 | sixteen | 7 |
| 17 | seventeen | 9 |
| 18 | eighteen | 8 |
| 19 | nineteen | 8 |
Tens:
- twenty = 6
- thirty = 6
- forty = 5
- fifty = 5
- sixty = 5
- seventy = 7
- eighty = 6
- ninety = 6
Step 2: Python code
ones = {
1: len("one"),
2: len("two"),
3: len("three"),
4: len("four"),
5: len("five"),
6: len("six"),
7: len("seven"),
8: len("eight"),
9: len("nine"),
10: len("ten"),
11: len("eleven"),
12: len("twelve"),
13: len("thirteen"),
14: len("fourteen"),
15: len("fifteen"),
16: len("sixteen"),
17: len("seventeen"),
18: len("eighteen"),
19: len("nineteen"),
}
tens = {
20: len("twenty"),
30: len("thirty"),
40: len("forty"),
50: len("fifty"),
60: len("sixty"),
70: len("seventy"),
80: len("eighty"),
90: len("ninety"),
}
def letters(n):
if n == 1000:
return len("one") + len("thousand")
if n >= 100:
h = ones[n // 100] + len("hundred")
if n % 100 == 0:
return h
return h + len("and") + letters(n % 100)
if n >= 20:
return tens[(n // 10) * 10] + letters(n % 10)
if n == 0:
return 0
return ones[n]
total = sum(letters(i) for i in range(1, 1001))
print(total)
Step 3: Verification
The program correctly:
- uses British “and” formatting,
- ignores spaces and hyphens,
- handles exact hundreds properly,
- includes “one thousand”.
Evaluating the sum from $1$ to $1000$ gives:
$$21124$$
Answer: 21124