我正在玩Project Euler的Problem 220,我对有关该主题的维基百科文章Dragon Curve感到有些困惑。关于计算第n转的方向而不必绘制整个曲线的主题,它说:
首先,以k * 2 ^ m的形式表示n,其中k是奇数。第n圈的方向由k mod 4确定,即当k除以4时剩余的余数。如果k mod 4为1,则第n圈为R;如果k mod 4为3,则第n个转弯为L.
例如,要确定转弯方向76376:
76376 = 9547 x 8. 9547 = 2386x4 + 3 so 9547 mod 4 = 3 so turn 76376 is L
(问题涉及计算长度为2 ^ 50的Dragon曲线上某点的位置,因此实际绘制曲线是不可能的。)
答案 0 :(得分:3)
m是数字最低端的零位数。 只要数字是偶数,最简单的算法就是除以2, 但你也可以使用二进制搜索加快速度。
所有整数都可以用这种方式表示。
答案 1 :(得分:1)
任何整数都可以表示为k * 2 ^ m,其中k是奇数。要查看原因,请用二进制编写任意数字。从右边(最低有效位)开始,将会有一个全零的字符串。它可能是一个空字符串。零的数量是m。其余的比特组成k。 k的最低有效位是一个(因为如果它是零,你只需要扩展你的零串),所以k是奇数。
要找到k和m,你可能会写一个简单的循环(在本例中是Python):
def k_and_m(n):
k, m = n, 0
while (k % 2) == 0:
k >>= 1
m += 1
return k, m