Разбор acmp — В одном шаге от счастья

  • В этой теме 0 ответов, 1 участник, последнее обновление 2 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6460
      @admin

      Условие задачи взято с сайта acmp.ru (Время: 1 сек. Память: 16 Мб Сложность: 16%):

      Вова купил билет в трамвае 13-го маршрута и сразу посчитал суммы первых трёх цифр и последних трёх цифр номера билета (номер у билета шестизначный). Оказалось, что суммы отличаются ровно на единицу. «Я в одном шаге от счастья», — подумал Вова, — «или предыдущий или следующий билет точно счастливый». Прав ли он?

      Входные данные

      Входной файл INPUT.TXT содержит в первой строке число K – количество тестов. В следующих K строках записаны номера билетов. Количество тестов не больше 10. Номер состоит ровно из шести цифр, среди которых могут быть и нули. Гарантируется, что Вова умеет считать, то есть суммы первых трех цифр и последних трех цифр отличаются ровно на единицу.

      Выходные данные

      Выходной файл OUTPUT.TXT должен содержать K строк, в каждой из которых для соответствующего теста следует указать «Yes», если Вова прав, и «No», если нет.

      Примеры

      INPUT.TXT OUTPUT.TXT
      1 3
      715068
      445219
      012200
      Yes
      No
      Yes

      Разбор решения задачи

      До этого мы уже разбирали похожу задачу: «Счастливый билет«. Основная разница в том, что теперь нужно проверить «счастливость» n-1 и n+1.

      Так как проверить нужно будет два числа — целесообразно выделить проверку в отдельную функцию. Мы также, как и в прошлый раз — разобьем число на первые 3 цифры и вторые три — с помощью операции целочисленного деления и взятия остатка:

      bool isLucky(int number) {
        int lhs = number / 1000;
        int rhs = number % 1000;
      
        return digitsSum(lhs) == digitsSum(rhs);
      }

      Функция digitSum вычисляет сумму цифр числа — может быть реализована одним из способо, описанных тут.

      Одна из возможных реализаций программы может выглядеть так:

      #include <fstream>
      using namespace std;
      
      int digitsSum(int n) {
        int sum = 0;
        while (n != 0) {
          sum += n % 10;
          n /= 10;
        }
      
        return sum;
      }
      
      bool isLucky(int number) {
        int lhs = number / 1000;
        int rhs = number % 1000;
      
        return digitsSum(lhs) == digitsSum(rhs);
      }
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n;
        ifst >> n;
      
        for (int i = 0; i < n; ++i) {
          int number;
          ifst >> number;
      
          if (isLucky(number-1) || isLucky(number+1))
            ofst << "Yes" << endl;
          else
            ofst << "No" << endl;
        }
      }

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.