序列是这样的.. 7,8,77,78,87,88,777,778,787,788
等等..
找到第n个序列的逻辑是什么?我尝试将它除以2然后再加4,因此它似乎不起作用。
答案 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)
<强>观察:强>
序列似乎是一个仅包含数字7和8的数字的升序列表。
位数不减少,对于每个n位数部分,序列中有2 ** n
个数字。
前半部分的n位数字以7开头,后半部分以8开头。
对于每一半的n位数字,第一位数字后面的其余数字与n-1位数字相同。
这些事实可用于构建合理有效的递归实现。
这是一个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