解决这个序列的逻辑是什么?

时间:2010-09-09 19:44:22

标签: algorithm logic

序列是这样的.. 7,8,77,78,87,88,777,778,787,788等等..

找到第n个序列的逻辑是什么?我尝试将它除以2然后再加4,因此它似乎不起作用。

7 个答案:

答案 0 :(得分:22)

二进制,从两个开始计算,忽略前导数字,使用7和8表示零和一:

        7,  8,  77,  78,  87,  88,  777,  778,  787,  788
 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011 

答案 1 :(得分:15)

<强>观察:

  1. 序列似乎是一个仅包含数字7和8的数字的升序列表。

  2. 位数不减少,对于每个n位数部分,序列中有2 ** n个数字。

  3. 前半部分的n位数字以7开头,后半部分以8开头。

  4. 对于每一半的n位数字,第一位数字后面的其余数字与n-1位数字相同。

  5. 这些事实可用于构建合理有效的递归实现。

    这是一个C#实现:

    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 :(得分:4)

由于块的大小呈指数增长(长度为1的2个元素,长度为2的4个元素,长度为3的8个元素等),因此可以轻松确定结果编号中的位数。

    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表示1(用​​零填充长度len)。非常简单。

我假设索引从1开始。

答案 3 :(得分:2)

将0替换为7,将1替换为8,并将其视为二进制序列

答案 4 :(得分:2)

它看起来像一个简单的二进制序列,其中7代表二进制零,8代表二进制1。

答案 5 :(得分:2)

写成PHP。我假设序列元素从1开始编号。

$n = 45;
// let's 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
                       );

答案 6 :(得分:1)

您可以通过执行以下操作直接计算第个(num ,而无需递归或循环(示例代码在MATLAB中):

  • 计算数字中的位数:

    nDigits = floor(log2(num+1));
    
  • 在第一次减去一个小于2的数字num之后,找到数字nDigits的二进制表示(只有前nDigits个数字):

    binNum = dec2bin(num-(2^nDigits-1),nDigits);
    
  • 为1和0字符串中的每个值添加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