На днях наткнулся на задачу, которую задают при собеседовании на позицию разработчика.
Условие задачи следующее: написать программу, которая посчитает количество "счастливых" 6-значных чисел, т.е. таких чисел, в которых сумма первых 3-х цифр равна сумме последних 3-х.
Решение:
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
Условие задачи следующее: написать программу, которая посчитает количество "счастливых" 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 коммент.:
Предлагаю добавить таймер, чтобы потом оценить другие решения. ИМХО не самый оптимальный код... попробую размяться на неделе)
Очень интересно будет увидеть еще варианты решения :) На счет таймера сейчас сделаю апдейт статьи.
Немного маниакальной херни =)
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);
Спасибо за решение =)
Твой код выполняется в среднем за 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 мс.
Отправить комментарий