К основному контенту

Задача 17 Счет букв в числительных

Условие:

Если записать числа от 1 до 5 английскими словами (one, two, three, four, five), то используется 3 + 3 + 5 + 4 + 4 = 19 букв.
Сколько букв понадобится для записи всех чисел от 1 до 1000 (one thousand) включительно?

Решение

Если честно, я не очень люблю "лингвистические" задачи за достаточно сложные условия и минимум размаха для написания красивой логики, но все же возьмусь за эту. 
Для начала определим словарь, в котором определим слова, которые сложно составить при помощи функции. Это будут числа от 1  до 13 и десятки

nums={
    1:'one',
    2:'two',
    3:'three',
    4:'four',
    5:'five',
    6:'six',
    7:'seven',
    8:'eight',
    9:'nine',
    10:'ten',
    11:'eleven',
    12:'twelve',
    13:'thirteen',
    15:'fifteen',
    18:'eighteen',
    20:'twenty',
    30:'thirty',
    40:'forty',
    50:'fifty',
    60:'sixty',
    70:'seventy',
    80:'eighty',
    90:'ninety',
    }

Затем определим функцию, генерирующую числа

def gen_num(n,dic):
    tmp=''
    t=str(n)
    if dic.get(n,False):
        return dic[n]
    elif n<20:
        return dic[int(t[1])]+'teen'
    elif n<100:
        tmp=n-int(t[1])
        return dic[tmp]+dic[int(t[1])]
    elif n<1000:
        if t[1:3]=='00':
            return dic[int(t[0])]+'hundred'
        else:
            return dic[int(t[0])]+'hundredand'+gen_num(int(t[1:3]),nums)
    elif n==1000:
        return 'onethousand'
Данная функция если находит передаваемое число в словаре - возвращает значение числа на английском, если нет - пытается составить. Для чисел от 13-ти до 20-ти вставляем в окончание teen, числа до 100 - находим значение 10-тка в словаре и добавляем значение единиц
К примеру 23 будет 20:twenty + 3:trhee = twentythree..
Для сотен находим в словаре первую цифру числа, добавляем hundred. Если последующие числа 00 ничего не добавляем иначе добавляем and и рекурсивно вызываем эту же функцию для определения значений двух последующих цифр.

Далее осталось вызывать функцию в цикле  и суммировать длину возвращаемых значений

s=0
for i in range(1,1001):
    s+=len(gen_num(i,nums))
    print(gen_num(i,nums))
print(s)

Популярные сообщения из этого блога

Задача №3 Наибольший простой делитель

Условие задачи Простые делители числа 13195 - это 5, 7, 13 и 29. Каков самый большой делитель числа 600851475143, являющийся простым числом? Решение Простым числом, является натуральное число больше единицы, которое имеет 2 делителя - 1 и само себя.  Для начала найдем все простые делители необходимого числа.  Чтобы сократить поиск будем перебирать до квадратного корня  600851475143 округленного вверх  ( функцией  math.ceil) Перебор будем вести начиная с числа 3. Если i делит число на цело, рекурсивно обращаемся к функции issimple c аргументом i. Функция issimple возвращает пустой список если число является простым. В этом случае число попадает в результирующий список Далее остается только вернуть максимальное значение массива простых чисел, которые нацело делят число 600851475143  Код Python import math def issimple(a): r=math.ceil(math.sqrt(a)) lst=[] for i in range(3,r): if a%i==0: if issimple(i)==[]: lst.app

Задача №1 Сумма чисел, кратных 3 м и 5-ти

 . Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение

Задача 21. Дружественные числа

Пусть d( n ) определяется как сумма делителей  n  (числа меньше  n , делящие  n  нацело). Если d( a ) =  b  и d( b ) =  a , где  a  ≠  b , то  a  и  b  называются дружественной парой, а каждое из чисел  a  и  b  - дружественным числом. Например, делителями числа 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, поэтому d(220) = 284. Делители 284 - 1, 2, 4, 71, 142, поэтому d(284) = 220. Подсчитайте сумму всех дружественных чисел меньше 10000. Решение Для начала определим функцию, которая будет возвращать сумму делителей числа: def get_sum(n):     s=0     for i in range(1,n):         if n%i==0:             s+=i     return s Думаю не требует объяснений все довольно тривиально Далее определяем функцию, возвращающую список дружественных чисел до числа n:   def gen_friendlys(n):     res=[]     for i in range(1,n):         if i not in res:             tmp=get_sum(i)             if i==get_sum(tmp) and i!=tmp:                 res.append(i)                 res.