Проблема:
На свій вибір мови напишіть найкоротшу функцію, яка повертає підлогу квадратного кореня неподписаного 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 (On) з дуже малим числом символів, але час O (log (n)) було б дійсно краще (тобто, якщо припустити вхідне значення 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