Решаем задачу с числами 3 и 5 на C++

newbie_

Опубликован:  2019-06-02T05:50:50.578736Z
Отредактирован:  2019-06-02T05:57:54.997600Z

Практикум программирования на С++ я начну с решения простых, иногда даже нелепых учебных задач, которые, впрочем, вполне могут стать объектом интереса на собеседованиях, если вдруг мне захочется найти работу. И первой в моём списке следует ненаховская задача с числами 3 и 5.

Скажу пару слов о самой задаче... Впервые условия этой задачи мне сформулировал Андрей Ненахов - "духовный" лидер и командир Redsolution, поэтому в моих ассоциациях к ней приклеилось прозвище ненаховская задача, надо отдать должное автору задачи, он, по крайней мере, попросил меня решить её за компьютером а не на листе бумаги. Мой практический опыт показывает, что если на собеседовании вас просят решить ненаховскую задачу, то можно молча вставать и уходить.

Итак, условия задачи:

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

Для решения этой задачи у меня есть десктоп с великолепным Debian buster и все необходимые инструменты для работы с C++. Запускаю Geany и создаю новый файл, который будет содержать исходный текст задуманной программы.

1mEriCBtFN.png

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

Вариант первый: целое число не делится ни на три, ни на пять, тогда искомая строка будет иметь вид - 4.

Вариант второй: целое число делится на три, но не делится на пять, тогда искомая строка будет иметь вид - 6 три.

Вариант третий: целое число не делится на три, но делится на пять, тогда искомая строка будет иметь вид - 10 пять.

Вариант четвёртый: целое число делится на три и делится на пять, тогда искомая строка будет иметь вид - 15 три пять.

Поскольку все строки для чисел в интервале от единицы до ста будут выводиться одним столбиком, а числа в интервале имеют разную разрядность, хорошо бы выводимые программой строки предварительно выровнять. Выравнивать строки я буду следующим образом:

1
3   три
5   пять
15  три пять
99  три
100 пять

Поскольку в программировании, и в частности в программировании на C++ я являюсь нубом-самоучкой, то и решать задачу буду по-нубски, простыми и понятными алгоритмами с минимальным на текущий момент использованием возможностей диалекта и его стандартной библиотеки. Для решения задачи мне понадобятся два модуля стандартной библиотеки.

#include <iostream>
#include <string>

Форматирование строки, содержащей конкретное число будет осуществляться при помощи простой функции, декларирую эту функцию.

std::string show_n(const int n);

Выравнивание строк в столбце будет осуществляться с помощью ещё одной простой функции, её объявление будет выглядеть так.

std::string def_ph(const int n);

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

int main()
{
  for (int i = 1; i <= 100; i++)
    std::cout << show_n(i) << std::endl;
}

Сосредоточимся над определением вспомогательной функции def_ph (define placeholder). Функция должна возвращать строку, которая в зависимости от разрядности переданного функции аргумента будет состоять из двух пробелов, одно пробела, либо будет пустой строкой.

std::string def_ph(const int n)
{
  if (n < 10)
    return "  ";
  else if (n >= 10 and n < 100)
    return " ";
  else
    return "";
}

Используя функцию def_ph и функцию to_string стандартной библиотеки, я могу при помощи функции show_n соответствующим образом сформировать выводимую на печать строку в зависимости от переданного show_n аргумента.

std::string show_n(const int n)
{
  std::string r = std::to_string(n);
  if (!(n % 3) or !(n % 5))
  {
    r += def_ph(n);
    if (!(n % 3))
      r += " три";
    if (!(n % 5))
      r += " пять";
  }
  return r;
}

Здесь я использовал операцию модулус, которая находит остаток от целочисленного деления, и при помощи простой процедуры if и конкатенации строк сформировал искомую строку в зависимости от значения n.

Перехожу в терминал и пробую скомпилировать полученный код.

g++ numbers.cpp -o exe

2juIvKYvco.png

Компиляция завершилась успешно, без ошибок и предупреждений. Запускаю полученный исполняемый файл.

./exe

XM57igBcxg.png

iJrEy8XfRh.png

Когда-то Андрей Ненахов сказал мне, что эту задачу может решить только программист, а не программист решить её не сможет никогда. Задача решена, но на достигнутом останавливаться я не намерен, поэтому в следующих выпусках блога я порешаю ещё несколько характерных для собеседований простых задач, будет интересно... :)

Комментарии:

newbie_

2019-07-06T09:47:29.365507Z

Вариант решения с использованием стандартных средств форматирования

#include <iostream>

void pprint(const int n);

int main()
{
  for (int i = 1; i <= 100; i++)
    pprint(i);
  return 0;
}

void pprint(const int n)
{
  std::cout.width(3);
  std::cout.setf(std::ios_base::left, std::ios_base::adjustfield);
  std::cout << n;
  if (!(n % 3))
    std::cout << " три";
  if (!(n % 5))
    std::cout << " пять";
  std::cout << std::endl;
}