Разбор acmp — Счастливый билет

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

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

      Вы пользуетесь общественным транспортом? Вероятно, вы расплачивались за проезд и получали билет с номером. Счастливым билетом называют такой билет с шестизначным номером, где сумма первых трех цифр равна сумме последних трех. Т.е. билет с номером 385916 – счастливый, т.к. 3+8+5=9+1+6. Вам требуется написать программу, которая проверяет счастливость билета.

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

      В единственной строке входного файла INPUT.TXT записано одно целое число N (0 ≤ N < 10^6).

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

      В выходной файл OUTPUT.TXT нужно вывести «YES», если билет с номером N счастливый и «NO» в противном случае.

      Примеры

      INPUT.TXT OUTPUT.TXT
      1 385916 YES
      2 123456 NO

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

      Эту задачу можно решить различными способами.

      Можно, например, обрабатывать число как строку — вычислим сумму первых трех символов и сравним с суммой второй тройки. Похожий подход использовался при генерации всех счастливых билетов в разделе «Циклы» нашего учебника по С++.

      #include <fstream>
      #include <string>
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        string number;
        ifst >> number;
      
        if (number[0] + number[1] + number[2] == number[3] + number[4] + number[5])
          ofst << "YES";
        else
          ofst << "NO";
      }

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

      #include <fstream>
      
      using namespace std;
      
      int digitsSum(int n); 
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n;
        ifst >> n;
      
        int lhs = n / 1000;
        int rhs = n % 1000;
      
        if(digitsSum(lhs) == digitsSum(rhs))
          ofst << "YES";
        else
          ofst << "NO";
      }

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