이경수 선생님의 수학실험실

problem17 (Number letter counts) 본문

Project Euler

problem17 (Number letter counts)

(이경수) 2019. 2. 14. 20:12

problem17 (Number letter counts)


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 letters used in total.

If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? 


NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

In Python:


#Number letter counts

import time;

startTime = time.time()

Tens = [3, 6, 6, 5, 5, 5, 7, 6, 6]
digits = [3, 3, 5, 4, 4, 3, 5, 5, 4]
teens= [6, 6, 8, 8, 7, 7, 9, 8, 8]

#put 1-19 in list
list = [3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8]
#put 20-99 in list
for i in range(1, 9):
list.append(Tens[i])
for j in range(0, 9):
list.append(Tens[i] + digits[j])
#put 100-999
Hundreds = [10, 10, 12, 11, 11, 10, 12, 12, 11]
for i in range(0, 9):
list.append(Hundreds[i])
for j in range(0, 99):
list.append(Hundreds[i] + 3 + list[j])
#put 1000
list.append(3 + 8)
print(list)
print(sum(list))
endTime = time.time()
print(endTime - startTime, "seconds")

Run time: 0.0008540153503417969 seconds


//Euler17 Number letter counts

package project_euler;


import java.util.ArrayList;


public class Euler17 {

public static void main(String[] args) {

long startTime = System.currentTimeMillis();

int sum = 0;

ArrayList<Integer> list = new ArrayList<Integer>();

int[] tens = {3, 6, 6, 5, 5, 5, 7, 6, 6};

int[] digits = {3, 3, 5, 4, 4, 3, 5, 5, 4};

int[] teens = {6, 6, 8, 8, 7, 7, 9, 8, 8};

int[] hundreds = {10, 10, 12, 11, 11, 10, 12, 12, 11};

int[] first19 = {3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8};

//1-19

for (int i = 0; i < 19; i++) {

list.add(first19[i]);

}

//20-99

for (int i = 1; i < 9; i++) {

list.add(tens[i]);

for(int j = 0; j < 9; j++) {

list.add(tens[i] + digits[j]);

}

}

//100-999

for (int i = 0; i < 9; i++) {

    list.add(hundreds[i]);

    for (int j = 0; j < 99; j++) {

        list.add(hundreds[i] + 3 + list.get(j));

    }

}

//1000

list.add(3 + 8);

for (int i = 0; i < list.size(); i++) {

sum += list.get(i);

}

System.out.println(sum);

long endTime = System.currentTimeMillis();

System.out.println((double)(endTime - startTime) / (double)1000 + "seconds");

}

}


Run time: 0.003seconds



solution: 21124


[from Project Euler: https://projecteuler.net/problem=17]



'Project Euler' 카테고리의 다른 글

problem19 (Counting Sundays)  (0) 2019.02.16
problem18 (Maximum path sum I)  (0) 2019.02.16
problem16 (Power digit sum)  (0) 2019.02.14
Problem 15(Lattice paths)  (0) 2019.02.11
Problem 14(Longest Collatz sequence)  (0) 2019.02.10
Comments