我们在92题中说到“1,2,4,8,16,32,64和128这8个数字利用加法可以得到1~255中的任意数字”
现在把题目变换一下,用1, 3, 9, 27等3的幂,利用加法和减法组成任意的整数,3的幂可以使用其中任意一个或几个,但每个数字只能使用一次,例如:
- >>> fun(40)
- 40 = 27 + 9 + 3 + 1
- >>> fun(41)
- 41 = 81 - 27 - 9 - 3 - 1
- >>> fun(12345)
- 12345 = 19683 + 27 + 9 - 6561 - 729 - 81 - 3
复制代码
现在我们就一起编写这个函数吧,要求参数为一个正整数,函数最后打印出结果或return返回结果。
其实负数也可以做,为了简单点,就取1~n的正整数了。
我的解法:
就是先把数字转换为3进制,然后看哪位是2,就把它加一,最后都是0和1就对应3的幂了,以上是加法部分,前面加的位数还要再记下来,转换为3的幂,作为减法部分。
- def d2t(num):
- lst = []
- while num:
- num, i = num // 3, num % 3
- lst.append(i)
- lst.append(0)
- return lst
- def fun(n):
- list1 = d2t(n)
- list2 = []
- for i in range(len(list1) - 1):
- if list1[i] == 2:
- list1[i] = 0
- list1[i + 1] += 1
- list2.append(str(3**i))
- elif list1[i] == 3:
- list1[i] = 0
- list1[i + 1] += 1
- list1 = [str(3 ** i) for i in range(len(list1)) if list1[i]]
- print(n,'=', ' + '.join(list1[::-1]), end = ' ')
- if list2:
- print('-', ' - '.join(list2[::-1]))
复制代码
|