整数转换(数学表达式)
题目描述:
- 给定两个整数 a ≤ b, 编写一个程序,通过加1和乘以2的方式,用最少的步骤将a变换成b.
- 例如, 当b=23,a = 5 时,23 = ((5 * 2 + 1) * 2 + 1)
当b=113,a = 11 时,113 = ((((11 + 1) + 1) + 1) * 2 * 2 * 2 + 1)
思路:
首先a和b的关系分为两种(b大a小,a要变成b):
- 当 b = a: 直接就成功了,不需要做任何事情。
- 当 b < 2a: 只能不断加1,因为a一旦乘以2就大于b了。
- 当 b > 2a: 让a*2,然后看2a和b的关系。
个人认为最难解决的问题在于,先加1还是先乘2,比如说5和13,5 * 2需要加 3 个 1就是四个步骤,而(5+1)* 2 + 1,只需要三个步骤。
所以个人认为在判断的时候应该让b除以2和a比较,而不是a乘以2和b比较。
代码
def intSeq(a, b):
if (a == b):
return str(a)
if (b % 2 == 1): #因为一个数乘以2必定是偶数,当b为奇数的时候-1变为偶数。
return "(" + intSeq(a, b-1) + " + 1)"
if (b < a * 2):
return "(" + intSeq(a, b-1) + " + 1)"
return intSeq(a, b/2) + " * 2"
试一下:
a = 5
b = 13
print(str(b) + " = " + intSeq(a, b))
13 = ((5 + 1) * 2 + 1)
a = 4
b = 101
print(str(b) + " = " + intSeq(a, b))
101 = ((((4 + 1) + 1) * 2 * 2 + 1) * 2 * 2 + 1)