我正在尝试通过以下步骤找到达到“ 1”所需的最少步数:
对于每个步骤,我可以执行以下步骤之一:
该函数将被传递一个代表正整数的字符串。我的功能似乎可以正常工作,但在某些极端情况下我却失败了,但是我不确定如何找到会导致故障的极端情况。
n = int(n)
count = 0
while n > 1:
if int(n) & int(n-1) == 0:
count += len(str(bin(n))) - 3
break
if n % 2 == 0:
n /= 2
else:
if (n - 1) % 4 == 0:
n -= 1
else:
n += 1
count += 1
return count
以下是通过测试的几个示例:
输入:solution.solution('15') 输出:5 (15-> 16-> 8-> 4-> 2-> 1)
输入:solution.solution('4') 输出:2 (4-> 2-> 1)
答案 0 :(得分:0)
只需编写一个简单的解决方案,然后比较一堆输入的结果。
def elliott(n):
n = int(n)
count = 0
while n > 1:
if int(n) & int(n-1) == 0:
count += len(str(bin(n))) - 3
break
if n % 2 == 0:
n //= 2
else:
if (n - 1) % 4 == 0:
n -= 1
else:
n += 1
count += 1
return count
def naive(n):
reached = {int(n)}
steps = 0
while 1 not in reached:
for x in reached.copy():
reached |= {x - 1, x + 1}
if x % 2 == 0:
reached.add(x // 2)
steps += 1
return steps
for n in range(1, 20):
x, y = elliott(n), naive(n)
if x != y:
print(n, x, y)
输出:
3 3 2
6 4 3
11 6 5
12 5 4
13 6 5