Какова логика решения этой последовательности?
Последовательность будет выглядеть следующим образом: 7,8,77,78,87,88,777,778,787,788
и т.д.
Какова может быть логика для нахождения n-го числа последовательности? Я пробовал это, разделив его на 2, а затем на 4 и, следовательно, но он не работает.
Ответы
Ответ 1
Замечания:
-
Последовательность выглядит как восходящий список чисел, содержащих только цифры 7 и 8.
-
Число цифр не уменьшается и для каждой секции n-цифр в последовательности есть 2 ** n
.
-
Первая половина n-разрядных чисел начинается с 7, а вторая половина начинается с 8.
-
Для каждой половины n-значных чисел оставшиеся цифры после первого совпадают с номерами n-1 цифр.
Эти факты могут быть использованы для построения достаточно эффективной рекурсивной реализации.
Вот реализация С#:
void Main() {
for (int i = 0; i < 10; i++)
Console.WriteLine (GetSequence(i));
}
string GetSequence(int idx) {
if (idx == 0) return "7";
if (idx == 1) return "8";
return GetSequence(idx / 2 - 1) + GetSequence(idx % 2);
}
Вывод:
7
8
77
78
87
88
777
778
787
788
Ответ 2
Двоичный, считая от двух, игнорируя ведущую цифру, используя 7 и 8 для нуля и один:
7, 8, 77, 78, 87, 88, 777, 778, 787, 788
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011
Ответ 3
Так как размер блока растет экспоненциально (2 элемента длиной 1, 4 элемента длиной 2, 8 элементов длины 3 и т.д.), вы можете легко определить количество цифр в номере результата.
long block_size = 2;
int len = 1;
while (n > block_size) {
n -= block_size; // n is changed here
block_size *= 2;
++len;
}
Теперь вы просто создаете двоичное представление n - 1
, с 7 для нулей и 8 для одних (добавьте его до длины len
с нулями). Довольно просто.
Я предполагаю, что индексы начинаются с 1 здесь.
Ответ 4
замените 0 на 7 и 1 на 8 и рассмотрите его как двоичную последовательность
Ответ 5
Он выглядит как простая двоичная последовательность, где 7 представляет двоичный нуль, а 8 представляет двоичный код.
Ответ 6
Написано как PHP. Я предполагаю, что элементы последовательности нумеруются начиная с 1.
$n = 45;
// let find the 45th sequence element.
$length = 1;
while ( $n >= pow(2, $length + 1) - 1 ) {
$length++;
}
// determine the length in digits of the sequence element
$offset = $n - pow(2, $length) + 1;
// determine how far this sequence element is past the
// first sequence element of this length
$binary = decbin($offset);
// obtain the binary representation of $offset, as a string of 0s and 1s
while ( strlen($binary) < $length ) {
$binary = '0'.$binary;
}
// left-pad the string with 0s until it is the required length
$answer = str_replace( array('0', '1'),
array('7', '8'),
$binary
);
Ответ 7
Вы можете вычислить это непосредственно для N-го числа (num
) без рекурсии или цикла, выполнив следующее (код примера находится в MATLAB):
-
Вычислить количество цифр в числе:
nDigits = floor(log2(num+1));
-
Найдите двоичное представление числа num
(только первые цифры nDigits
) после первого вычитания одного из двух меньших, поднятых до мощности nDigits
:
binNum = dec2bin(num-(2^nDigits-1),nDigits);
-
Добавьте 7 к каждому значению в строке единиц и нулей:
result = char(binNum+7);
И вот тест, поставив три вышеуказанных шага в одну анонимную функцию f
:
>> f = @(n) char(dec2bin(n+1-2^floor(log2(n+1)),floor(log2(n+1)))+7);
>> for n = 1:20, disp(f(n)); end
7
8
77
78
87
88
777
778
787
788
877
878
887
888
7777
7778
7787
7788
7877
7878