Щоб знайти цифрову твердість цілого числа, візьміть його двійкове представлення і підрахуйте кількість разів, яку можна вилучити як провідним, так і кінцевим,
1
поки воно не починається або закінчується знаком a0
. Загальна кількість вилучених біт - це його цифрова твердість.
Це досить багатослівне пояснення - тож давайте розбимо його на відпрацьованому прикладі.
Для цього прикладу ми будемо використовувати число 3167. У двійковому вигляді це:
110001011111
(Зверніть увагу, що під час перетворення у двійкові ви повинні переконатися у позбавленні провідних нулів)
Це не починається і не закінчується 0
, тому ми видаляємо 1 пару біт:
1 1000101111 1
І ще:
11 00010111 11
Але зараз на початку є 0, тому ми не можемо видалити більше 1
пар. Загалом 4 біта ми видалили, і так 4 - цифрова твердість 3167.
Однак для чисел, які можна записати як 2 n -1 для додатного n (тобто містять лише 1
у двійковому поданні), 0 ніколи не буде досягнуто, і тому всі біти можна буде видалити. Це означає, що твердість - це просто ціла довжина біта.
Змагання
Ваше завдання полягає в тому, щоб написати програму або функцію, яка з урахуванням невід'ємного цілого числа n >= 0
визначає її цифрову твердість.
Ви можете подати повну програму, яка виконує введення-виведення, або функцію, яка повертає результат. Ваша заявка повинна працювати для значень, що знаходяться в n
межах стандартного цілого діапазону вашої мови.
Випробування
Будь ласка, повідомте мене, якщо будь-яке з них є невірним, або ви хочете запропонувати будь-які крайові випадки додати.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Ось нерозроблений Python-рішення, яке я використовував для створення цих тестових випадків (не гарантовано, що вони не мають помилок):
def hardness(num) -> int:
binary = bin(num)[2:]
if binary.count('0') == 0:
return num.bit_length()
revbin = binary[::-1]
return min(revbin.find('0'), binary.find('0')) * 2
1
повернути 1, коли в ньому немає жодного0
? Я маю на увазі, ви не можете видалити достатню кількість знаків із рядка, щоб почати чи закінчити її0
.