Подтвердить что ты не робот

Какова логика решения этой последовательности?

Последовательность будет выглядеть следующим образом: 7,8,77,78,87,88,777,778,787,788 и т.д.

Какова может быть логика для нахождения n-го числа последовательности? Я пробовал это, разделив его на 2, а затем на 4 и, следовательно, но он не работает.

4b9b3361

Ответ 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