"Счастливые числа"

На днях наткнулся на задачу, которую задают при собеседовании на позицию разработчика.

Условие задачи следующее: написать программу, которая посчитает количество "счастливых" 6-значных чисел, т.е. таких чисел, в которых сумма первых 3-х цифр равна сумме последних 3-х.

В голову пришло сразу несколько вариантов решения данной задачи. Публикую наиболее лаконичное из них, написанное на языке C#. Буду признателен, если кто-либо в комментариях предложит свой вариант решения. Можете использовать тот язык программирования, который более удобен вам.

Заранее извиняюсь за неудобный, нечитабельный вид кода. Как только разберусь с нормальным форматированием кода в blogspot, сделаю update статьи.

Update: Для измерения времени выполнения программы используется класс Stopwatch. Измерения проводятся на ноутбуке с процессором Intel Core i5 (частота 2,4 GHz)


Решение:
using System;
using System.Diagnostics;

namespace HappyNumbers
{
   class Program
   {
      static void Main(string[] args)
      {
         int count = 0;

         var sw = new Stopwatch();
         sw.Start();

         for (int i = 1; i <= 9; i++)
         {
            for (int j = 0; j <= 9; j++)
            {
               for (int k = 0; k <= 9; k++)
               {
                  for (int x = 0; x <= 9; x++)
                  {
                     for (int y = 0; y <= 9; y++)
                     {
                        for (int z = 0; z <= 9; z++)
                        {
                           if (i + j + k == x + y + z)
                           {
                              count++;
                           }
                        }
                     }
                  }
               }
            }
         }

         sw.Stop();

         System.Console.WriteLine(String.Format("Total: {0}", count));
         Console.WriteLine(String.Format("Execution time: {0} ms", sw.ElapsedMilliseconds));

         Console.ReadKey();
      }
   }
}
Результат выполнения программы:
Total: 50412
Execution time: 6 ms

4 коммент.:

Unknown

Предлагаю добавить таймер, чтобы потом оценить другие решения. ИМХО не самый оптимальный код... попробую размяться на неделе)

Andriy Nesterenko

Очень интересно будет увидеть еще варианты решения :) На счет таймера сейчас сделаю апдейт статьи.

Unknown

Немного маниакальной херни =)

long timeout = System.currentTimeMillis();

int i = 0;

for (Integer number=100000; number<=999999; number++) {
String numberStr = number+" ";
char[] elements = numberStr.toCharArray();
int firstPart = elements[0]+elements[1]+elements[2];
int secondPart = elements[3]+elements[4]+elements[5];
if (firstPart == secondPart)
i++;
}

timeout = System.currentTimeMillis() - timeout;
System.out.println(timeout);
System.out.println(i);

Andriy Nesterenko

Спасибо за решение =)
Твой код выполняется в среднем за 233 мс. Чисто ради профессионального интереса, попробовал упростить твой код. Получилось следующее:

long timeout = System.currentTimeMillis();

int i = 0;

for (Integer number=100000; number<=999999; number++)
{
   char[] elements = number.toString().toCharArray();

   if (elements[0]+elements[1]+elements[2] == elements[3]+elements[4]+elements[5])
      i++;
}

timeout = System.currentTimeMillis() - timeout;
System.out.println(timeout);
System.out.println(i);

Время выполнения уменьшилось более чем в 2 раза и составляет в среднем 110 мс.

Отправить комментарий