Проблема:
Выбирая язык, напишите кратчайшую функцию, которая возвращает пол квадратного корня 64-разрядного целого числа без знака.
Тестовые случаи:
Ваша функция должна работать правильно для всех входов, но вот несколько, которые помогают проиллюстрировать идею:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
Правила:
- Вы можете назвать свою функцию как угодно. (Безымянные, анонимные или лямбда-функции в порядке, если они так или иначе могут вызываться.)
- В этом испытании важнее всего количество символов, но важно и время выполнения. Я уверен, что вы могли бы итеративно сканировать ответ в течение O (√n) времени с очень небольшим количеством символов, но время O (log (n)) было бы действительно лучше (то есть, предполагая, что входное значение n, не битовая длина п).
- Возможно, вы захотите реализовать функцию с использованием чисто целочисленной и / или логической арифметики. Однако, если вы действительно хотите использовать вычисления с плавающей запятой, это нормально, если вы не вызываете библиотечные функции. Таким образом, просто говорить
return (n>0)?(uint32_t)sqrtl(n):-1;
в C запрещено, даже если это даст правильный результат. Если вы используете арифметику с плавающей точкой, вы можете использовать*
,/
,+
,-
и возведение в степень (например,**
или ,^
если это встроенный оператор в выбранном вами языке, но только экспоненцирование полномочий не менее 1 ). Это ограничение состоит в том, чтобы предотвратить «мошенничество» путем вызоваsqrt()
или варианта или повышения значения до степени ½. - Если вы используете операции с плавающей точкой (см. # 3), вам не требуется, чтобы возвращаемый тип был целочисленным; только то, что возвращаемое значение является целым числом, например, floor (sqrt (n)), и может содержать любое 32-разрядное значение без знака.
- Если вы используете C / C ++, вы можете предположить существование беззнаковых 64-битных и 32-битных целочисленных типов, например,
uint64_t
иuint32_t
как определено вstdint.h
. В противном случае просто убедитесь, что ваш целочисленный тип может содержать любое 64-разрядное целое число без знака. - Если ваш язык не поддерживает 64-битные целые числа (например, Brainfuck, по-видимому, поддерживает только 8-битные целые числа), приложите все усилия и укажите ограничение в заголовке вашего ответа. Тем не менее, если вы сможете понять, как кодировать 64-разрядное целое число и правильно получить квадратный корень из него, используя 8-разрядную примитивную арифметику, тогда вам больше сил!
- Веселитесь и будьте креативны!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2