每天开心一点

Python:每日一题 97

2017-11-27 14:52:00    六月    670    来源: http://bbs.fishc.com/thread-96163-1-1.html

我们在92题中说到“1,2,4,8,16,32,64和128这8个数字利用加法可以得到1~255中的任意数字”
现在把题目变换一下,用1, 3, 9, 27等3的幂,利用加法和减法组成任意的整数,3的幂可以使用其中任意一个或几个,但每个数字只能使用一次,例如:
  1. >>> fun(40)
  2. 40 = 27 + 9 + 3 + 1
  3. >>> fun(41)
  4. 41 = 81 - 27 - 9 - 3 - 1
  5. >>> fun(12345)
  6. 12345 = 19683 + 27 + 9 - 6561 - 729 - 81 - 3
复制代码


现在我们就一起编写这个函数吧,要求参数为一个正整数,函数最后打印出结果或return返回结果。

其实负数也可以做,为了简单点,就取1~n的正整数了。

我的解法:

就是先把数字转换为3进制,然后看哪位是2,就把它加一,最后都是0和1就对应3的幂了,以上是加法部分,前面加的位数还要再记下来,转换为3的幂,作为减法部分。

  1. def d2t(num):
  2.     lst = []
  3.     while num:
  4.         num, i = num // 3, num % 3
  5.         lst.append(i)
  6.     lst.append(0)
  7.     return lst

  8. def fun(n):
  9.     list1 = d2t(n)
  10.     list2 = []
  11.     for i in range(len(list1) - 1):
  12.         if list1[i] == 2:
  13.             list1[i] = 0
  14.             list1[i + 1] += 1
  15.             list2.append(str(3**i))
  16.         elif list1[i] == 3:
  17.             list1[i] = 0
  18.             list1[i + 1] += 1
  19.     list1 = [str(3 ** i) for i in range(len(list1)) if list1[i]]
  20.     print(n,'=', ' + '.join(list1[::-1]), end = ' ')
  21.     if list2:
  22.         print('-', ' - '.join(list2[::-1]))
复制代码