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

Project Euler Problem 17

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