Задача о счастливом билете
Создание: 14.03.2013
Все знают, что «счастливым» называется билет, у которого сумма первых трех цифр равно сумме вторых трех цифр. Рассмотрим, как решается задача определения счастья в MS Excel и в среде программирования.

Конструируем формулу в электронной таблице

Задача: В ячейка электронной таблицы хранится шестизначное число, необходимо написать формулу, которая выведет одно из двух слов «счастливое» или «увы»

Для определения счастья необходимо выделить каждую цифру в этом числе. Нам поможет текстовая функция =ПСТР() она выделят из строки произвольное количество знаков. Функция имеет три аргумента: исходный текст, начальная позиция и количество извлекаемых знаков.


В примере из ячейки A1, извлекается 1 символ начиная с третьей позиции.

Теперь применив эту формулу шесть раз мы получим в шести ячейках отдельные цифры исходного числа. Для определения счастья нам понадобится логическая функция = ЕСЛИ(). У функции три аргумента: логическое выражение, значение, которое возвращается (выводится) в случае если выражение истинное, и значение которое возвращается в случае лжи.


В примере логическое выражение возвращает «счастливый» если сумма первых трех ячеек равна сумме вторых трех чисел,
и «увы» в обратном случае.

Объединим эти два приема, и получим следующую функцию:


Формула объединена в единую ячейку.

=ЕСЛИ((ПСТР(A1;4;1)+ПСТР(A1;5;1)+ПСТР(A1;6;1))=(ПСТР(A1;1;1)+ПСТР(A1;2;1)+ПСТР(A1;3;1));"счастливый";"увы")

Пишем программу

Напишем программу, которая подсчитает количество счастливых чисел.

Program happy;
var i,n:integer;
a1,a2,a3,a4,a5,a6:integer;
begin
   n:=0;
   for i:=0 to 999999 do
   begin
      a1:=i mod 10;          // первый младший разряд
      a2:=i div 10 mod 10;   // второй разряд и т.д.
      a3:=i div 100 mod 10;
      a4:=i div 1000 mod 10;
      a5:=i div 10000 mod 10;
      a6:=i div 100000;
      if ((a1+a2+a3)=(a4+a5+a6)) then n:=n+1;
  end;
  writeln('Всего счасливых билетов: ',n);
end.

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

Обращаю ваше внимание, программа правильно работает в Pascal ABC и не верно в TurboPascal а все потому, что тип integer в TurboPascal хранится в 16 ячейках памяти и максимальное значение, которое может принять ~ 32000 Для нашей задачи это мало.

Есть принципиально иное решение:

Program happy;
var n:integer;
a1,a2,a3,a4,a5,a6:integer;
begin
   n:=0;
   for a1:=0 to 9 do
     for a2:=0 to 9 do
       for a3:=0 to 9 do
         for a4:=0 to 9 do
           for a5:=0 to 9 do
             for a6:=0 to 9 do
               if ((a1+a2+a3)=(a4+a5+a6)) then n:=n+1;
   writeln('Количество счасливых билетов: ',n);
end.

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

P.S.

За этот материал появился благодаря вопросу неизвестной девушке Анастасии из Новосибирска. Она обратилась ко мне с вопросом. За вдохновение ей спасибо)