Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 17 задачи (Счет букв в числительных)

Проект Эйлера (17 задача) при написании программы потребует в основном внимательности, чтобы не запутаться в английской грамматике.

Узнать больше в телеграм-канале: ProjectEuler++

Условия задачи

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

Сколько букв понадобится для записи всех чисел от 1 до 1000 (one thousand) включительно?

Примечание: Не считайте пробелы и дефисы. Например, число 342 (three hundred and forty-two) состоит из 23 букв, число 115 (one hundred and fifteen) – из 20 букв. Использование “and” при записи чисел соответствует правилам британского английского.

Всегда Вам рады)

Решение (проект Эйлера - 17 задача)

Проект Эйлера (17 задача) - решение
Проект Эйлера (17 задача) - решение

Задачи проекта Эйлера “цепляются” друг за друга и решения, потому что выработанные в первых задачах могут пригодиться в последующих, более сложных. Потому не стал все писать в функцию main(), а выделил подсчет букв в числе в отдельную функцию. 

В итоге в main() только измеряется время выполнения программы и перебираются числа от 1 до 1000.

* Примечание:

Это прототип функции. Пишется перед функцией main()
Сама реализация функции при этом определяется позже.

Описание работы функции count_letters()

Количество букв в английских числах
Количество букв в английских числах

Для начала сделал себе небольшую шпаргалку – выписал все числа и посчитал цифры в них.

При этом нужно помнить, что между сотнями и десятками добавляется and.

 

Функция для подсчета количества букв в английских числительных - проект Эйлера (17 задача)
Функция для подсчета количества букв в английских числительных - проект Эйлера (17 задача)

Для хранения длин чисел использовал массив:

  • массив[число] = длина числительного;
  • массив[12] = 6; //twelve

Также отдельно записаны длины 100, 1000 и and. Можно, конечно, в коде оперировать сразу цифрами, однако потом все конечно позабудется и станет непонятным.

Итак, числительное состоит из нескольких слов:

  • three hundred and forty-two

Потому сначала считаются тысячи в числе и прибавляется длина этих числительных:

  • count += 11 //one thousand

После – сотни:

  • count += 10 //one hundred

Далее, если count не равен нулю (т.е. в числе есть сотни или тысячи) и существует еще остаток числа (т.е. десятки и единицы) – добавляется and (count += 3).

В итоге подобным же образом добавляются длины десятков и единиц.

  • count += 9 //twenty one
 

* Примечание:

Тернарное выражение, иначе можно написать так:

  • if(num/100 != 0)
    • count = len_ar_1_19[num/100] +len_100;
  • else
    • count = 0;

Контролируем корректность работы функции count_letters()

Проверка корректности работы функции - проект Эйлера (17 задача)
Проверка корректности работы функции - проект Эйлера (17 задача)

Поскольку в дальнейшем эта функция может быть применена в другой программе, то контекст может измениться. Потому, чтобы избежать неправильной работы, в ней сделана проверка корректности принимаемого значения.

  • if (num > 9999 || num < 1)
     

В итоге значения чисел, выходящие за рамки, на которые рассчитана функция, она считать не будет и сразу вернет 0.

Однако программа при этом не прервется, просто будет считаться длина следующих чисел. Потому, чтобы не гадать потом о причинах некорректного ответа, функция выведет некорректное число и предупреждение в консоль.

Измеряем время работы программы

Для измерения времени работы программы подключаем библиотеку time.h:

  • #include <time.h> 

С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.

* Примечания:

clock_t это тип данных, определенный через typedef. По сути это обычный целочисленный long

(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)

CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000

Ответ и скорость работы программы (проект Эйлера - 17 задача)

Проект Эйлера (17 задача) - ответ
17 задача ответ

В итоге ответ на 17 задачу проекта Эйлера составил 21124, программа считает ответ мгновенно. 

По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.

проект Эйлера
Курс "C/C++ для начинающих"

Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))

Есть вопросы, господа?

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

© 2023-2024 | eulerproject.ru