【发布时间】:2016-10-20 22:36:56
【问题描述】:
我不太清楚如何描述我的意思,所以让我试着举例说明(请耐心等待)。
当你简单地增加一个整数时,你会得到一个像这样的二进制序列(假设这个问题是 8 位):
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 0
0 0 0 0 0 1 1 1
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 1
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 1
0 0 0 0 1 1 0 0
0 0 0 0 1 1 0 1
0 0 0 0 1 1 1 0
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 1
0 0 0 1 0 0 1 0
0 0 0 1 0 0 1 1
0 0 0 1 0 1 0 0
0 0 0 1 0 1 0 1
0 0 0 1 0 1 1 0
0 0 0 1 0 1 1 1
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 1
0 0 0 1 1 0 1 0
0 0 0 1 1 0 1 1
0 0 0 1 1 1 0 0
0 0 0 1 1 1 0 1
0 0 0 1 1 1 1 0
0 0 0 1 1 1 1 1
[ ... etc ... ]
一种可视化方式是,每一列都代表一个“时钟”。每个时钟/列的频率是其右邻居频率的一半。
所以最右边的时钟有一个0,然后是一个1,等等。下一个时钟有两个0s,然后是两个1s,等等......
我对二进制字符串序列感兴趣,其中每个时钟都是其邻居的整数除法。
所以最右边的时钟仍然是一个0,一个1,下一个时钟仍然是两个0s,两个1s,但是第三个时钟是三个 0s 和 三个 1s 等
现在是 /1 /2 /3 /4 /5 ...,而不是 /1 /2 /4 /8 /16 ...。
序列现在看起来像这样:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 1 1 1
0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 1
0 0 1 1 1 0 1 0
0 1 1 1 1 0 1 1
1 1 1 1 0 0 0 0
1 1 1 1 0 1 0 1
1 1 1 0 0 1 1 0
1 1 1 0 0 1 1 1
1 1 0 0 1 0 0 0
1 1 0 0 1 0 0 1
1 0 0 0 1 0 1 0
1 0 0 1 1 1 1 1
0 0 0 1 0 1 0 0
0 0 0 1 0 1 0 1
0 0 1 1 0 0 1 0
0 0 1 1 0 0 1 1
[ ... etc ... ]
问题:在给定i-1 的值的情况下,是否有一种操作/算法可以给我i 的值?
换句话说,假设我处于第 4 步 (0 0 0 0 0 1 1 1)。是否可以对这个数字执行一些操作以获取第 5 步 (0 0 0 0 1 1 0 0) 的值,以及任何其他步骤的值?
在除以 2 的情况下,您只需增加数字 (i++),但在除以 N 的情况下,我似乎无法找到从一个到下一个的类似方法。我错过了什么明显的东西吗?
我尝试将序列转换为十进制,但该模式是 0, 1, 2, 7, 12, 29, 58, etc,这对我来说并不明显。
我现在这样做的蛮力方式是我有一个计数器数组(每个列/时钟一个),当达到相应列的“周期”时,我独立重置每个计数(所以 2第一列,第三列,等等)。但这感觉很丑。
我很想直接在数字上执行此操作,而不需要一系列计数器。这甚至可能吗?这是一个已知的序列吗?老实说,我什至不确定谷歌应该做什么。我会很感激这方面的任何线索。我很高兴在一些指导下进入兔子洞。
更新
根据@borrible 的观察,对于给定的i,i-1 的值不止一个,因此我原来的问题的解决方案是模棱两可的。因此,我将扩展我的问题以允许 i 作为输入(除了 i-1th 值。
【问题讨论】:
-
不知道这是否有帮助,但这里列出了序列:oeis.org/A175879。
-
你可以从它的索引中简单地计算出这样一个数字中的每一位,这足够了吗?也许你也可以从一个数字中计算一个索引并以这种方式递增..
-
我有一种奇怪的感觉,在给定 i-1 的情况下,您确实找不到数字 i,但是您可以通过将 2 (1, 2, 4, 8 ...) 对每个二进制数字使用模 1,2,3,4...。
-
查看我的更新答案。
标签: c algorithm binary computer-science clock