问题:

任何数都能分解成2的幂,比如

7=1+1+1+1+1+1+1

=1+1+1+1+1+2

=1+1+1+2+2

=1+2+2+2

=1+1+1+4

=1+2+4

共有6种分解方式,设f(n)为任意正整数可能分解总数,比如f(7)=6

写个算法,输入数,求出其分解的总数。

思路:

先按照树形结构,把一个数可能的2的幂的子数记录下来,比如7拆分成7个1,3个2,1个4。从高到底遍历所有可能的搭配。

import math

import copy

def get_distribute_for_number(number):

distribute = {}

distribute[0] = number

for i in range(0, int(math.log(number, 2) + 1)):

if i not in distribute:

break

count_i = distribute[i]

while count_i >= 2:

count_i -= 2

if i + 1 not in distribute:

distribute[i + 1] = 0

distribute[i + 1] += 1

return distribute

def count_by_distribute(distribute, number, parent_expr):

if number == 0:

print("expr : %s"%parent_expr[:-3])

return 1

max_leaf = len(distribute) - 1

if max_leaf == 0:

print("expr : %s"%(parent_expr + " 1 * %d"%number))

return 1

curr_distribute = copy.copy(distribute)

max_leaf_value = 2 ** max_leaf

max_leaf_num = curr_distribute.pop(max_leaf)

count = 0

for i in range(0, max_leaf_num + 1):

left = number - max_leaf_value * i

expr = parent_expr

expr += "%d * %d"%(max_leaf_value, i)

expr += " + "

if left < 0:

break

count_left = count_by_distribute(curr_distribute, left, expr)

count += count_left

#print("current distribute is ")

#print(curr_distribute)

#print("kept %d leaves of %d"%(i, max_leaf_value))

#print("distributing num for %d is %d"%(left, count_left))

return count

number = input("Input Number:")

distribute = get_distribute_for_number(number)

print("Distribute for num is")

print(distribute)

count = count_by_distribute(distribute, number, "")

print("Number %d can be distributed by %d ways"%(number, count))

分离数字的python编码_把数字拆分成2的幂的和相关推荐

  1. python数字类型-Python基础:数据类型-数字(5)

    在Python中,所有的数据类型都是类,每一个变量都是类的实例. Python中有6种标准数据类型:数字(Number).字符串(String).列表(List).元组(Tuple).集合(Sets) ...

  2. 怎么将一个数字高低位互换_多彩数字 多彩童年——东城幼儿园玩具研究教学案例...

    玩具是儿童的天使,孩子在天使的陪伴下,创造性地进行着自己的游戏活动.在幼儿众多的玩具中怎样甄别一款好玩的玩具,挖掘出玩具的最大教育价值,让他们在和玩具的互动中快乐地学习呢?下面,我们来看看老师们是怎样 ...

  3. 数字盲打怎么练_会计数字键盘盲打技巧

    1 会计 数字键盘盲打技巧 以下是会计数字键盘盲打技巧等等的介绍,希望可以为您提供帮助. 数字小键盘区(又名'辅助键区')位于键盘的右下方,主要用于快速输入数字,并加以编辑处理.它特别适合于经常与数字 ...

  4. python猜数字统计游戏次数_猜数字游戏(Python)

    在Python3中工作.在 我对Python还比较陌生(只有几个星期的知识).在 这个程序给我的提示是写一个随机数游戏,用户必须猜出随机数(1到100之间),如果不正确,就会提示它太低或太高.然后用户 ...

  5. python数字转拼音输出_将数字拼音转换为带声调的拼音

    我有一些python3代码可以做到这一点,它足够小,可以直接放在这里的答案中.在PinyinToneMark = { 0: "aoeiuv\u00fc", 1: "\u0 ...

  6. java猜数字游戏应用程序_猜数字游戏的Java小程序

    /* 猜数字游戏: 1,产生随机数. 2,获取键盘录入. 3,将录入数据变成数字,和随机数比较. 给出提示信息. 4,重复这个过程,如果猜中,程序就结束. 注意:对于输入1~100以外的数字,,以及非 ...

  7. java将数字替换为空_将数字替换为java中正确位置的单词

    实际上我正试图用用户给出的句子中的数字替换为单词.本案例日期格式;例如:我的生日是在16/6/2000,我是 java的新手 – >成为->我的生日是七月十六日,我是java的新手 这是代 ...

  8. 有重复数字的组合问题_带数字重复的组合和问题

    有重复数字的组合问题 Description: 描述: This is a standard interview problem to make some combination of the num ...

  9. 为什么python的命名不能以数字开头,Python模块名称以数字开头

    When I try to import a module in python(.py file) it gives a syntax error. The module name starts wi ...

最新文章

  1. 性别从后台获取得值的那点事儿
  2. 登录centos虚拟机后显示-bash-4.1
  3. 使用Spring编写和使用SOAP Web服务
  4. python七巧板三角形_用七巧板拼出14种三角形,这才是图形认知的神器!
  5. 伴随我成长的编程书,赶紧收藏!!
  6. springboot完成进度条_Springboot从0开始第一周
  7. 谷歌中巨大的 SEO 骗局!排名靠前的 HTML 编辑器也不可信
  8. 人人商城小程序服务器根目录,人人商城小程序前端怎么安装?人人商城小程序如何配置实用...
  9. 星环inceptor建表公式以及各个表的区别联系
  10. Docker的bridge和macvlan两种网络模式
  11. linux移动到回收站快捷键,linux中使用rm命令将文件移到回收站的方法
  12. 使用excel、python、tableau对招聘数据进行数据处理及可视化分析
  13. 就在那犹豫的一刹那,跌入那深渊
  14. php 泊松分布,关于检验泊松分布
  15. SpringBooot
  16. 1-系统C盘迁移到新买的固态硬盘SSD中有影响但不主要,但有必要将系统盘C盘迁移到新安装的 固态硬盘SSD中吗?
  17. 安卓flash插件_Flash 终将谢幕:微软将于年底停止对 Flash 的支持
  18. 联通物联卡为什么没有网络_物联网卡显示3g 联通物联网
  19. P/NP/NP完全/NP难问题
  20. 猪哥学习群直播第一期:人工智能在银行电信企业中的应用

热门文章

  1. 国际象棋java_国际象棋源代码-JAVA
  2. good man or bad man?
  3. YOLO v5 检测摄像头但却不显示检测图像 一招拿下
  4. ChromeDriver与Chrome版本对应关系及下载链接
  5. 现代诗与古典传统的关系
  6. 苏州职业大学计算机考试成绩查询系统,苏州工业园区职业技术学院教务管理系统登录入口、成绩查询网上选课查分...
  7. 扶不起的优酷,做不好的阿里大文娱,路远!
  8. 如何将PDF删除水印?PDF删除水印的方法
  9. 【Pytorch深度学习50篇】·······第六篇:【常见损失函数篇】-----BCELoss及其变种
  10. 服务器如何安装虚拟机,服务器如何安装虚拟机