`
peizhyi
  • 浏览: 30526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

把数字拆分成2的幂的和

 
阅读更多

问题:

    任何数都能分解成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))

 

1
1
分享到:
评论

相关推荐

    把一个数分解成2的次幂

    标题中的“把一个数分解成2的次幂”是指将一个整数表示为二进制下的各个位上2的幂的和。这是一个基础的数学概念,尤其在计算机科学中至关重要,因为计算机内部处理数据的方式是基于二进制的。在二进制系统中,每个...

    任意正整数都能拆成若干唯一的2的幂指数之和

    任意正整数都能拆成若干唯一的2的幂指数之和,php版本和js版本都有。

    同底数幂的乘法、幂的乘方与积的乘方练习2分享.pdf

    15. 最后一个问题是利用2 * 8^n * 16^n = 2^(22)求解n,这里可以将8和16转换为2的幂次形式来解决。 通过这些练习题,学生可以深入理解并熟练掌握同底数幂的乘法、幂的乘方和积的乘方的运算法则,以及如何应用这些...

    表达式求值与幂运算算法

    非递归求幂算法通常采用的是二进制的指数分解法,这种方法的核心思想是将指数n表示为2的幂次和的形式。具体实现时,通过不断地将n除以2并取余数来得到底数相乘的序列,最终通过累乘得到a的n次幂。在这个过程中,利用...

    noip 1998 普及组 带数据包

    这个知识点在解决上述问题时可能会起到关键作用,因为题目可能需要将输入的数字拆分成2的幂次方的形式。 在压缩包文件“NOIP1998普及组”中,可能包含了具体的题目描述、样例输入/输出、以及测试数据。参赛者需要...

    C语言案例分享题目水仙花数.docx

    2. **数字拆分**:对于每一个数字,我们需要将其拆分成个位数、十位数和百位数。 3. **计算和比较**:计算每位数字的三次幂之和,并与原数比较。如果相等,则该数为水仙花数。 4. **输出结果**:将找到的所有水仙花...

    大数的加、减、乘、除、求幂运算

    Long Multiplication类似于手算乘法,将两个大数拆分成多位,然后进行逐位的乘法和累加。Karatsuba算法是一种分治策略,可以减少计算量。 5. **除法**:大数除法相对复杂,可以采用类似手算的长除法,或者使用更...

    编程精确计算2的N次方 (N是介于100和1000之间的整数).zip

    4. **数字拆分与求和**:计算整数各位数字之和通常可以通过字符串操作实现,将整数转换为字符串,然后遍历每个字符(数字),将其转换回整数并累加。另外,也可以通过模运算和除法来实现,例如`num % 10`得到个位,`...

    计算机技术基础 数字技术基础 共25页.ppt

    二进制数是计算机的基础,它只有0和1两个数字,每一位的权重是2的次幂。比如101.01B,1在高位的百位上代表1×2²,0在十位上代表0×2¹,1在个位上代表1×2⁰,小数点后的01代表0×2⁻¹和1×2⁻²。二进制数的转换...

    数字逻辑推理题 提供练习

    - **解答**: 将每个数字拆分为三位一组:16-718-9110。观察发现,从左往右数第一位数分别是:1、7、9、11;第二位数都是1;第三位数分别是:6、8、10。由此可推测,下一位的第一位数应为13,第二位数仍为1,第三位数...

    同底数幂的乘法1PPT学习教案.pptx

    类似地,两个相同的幂相加并不等于它们指数的和,而应该拆分为单独的项,如 \( b^5 + b^5 = 2b^5 \)。 在实际解题中,需要灵活运用这些规则,例如 \( (-3)^2 \cdot (-3)^3 \) 应该是 \( (-3)^{2+3} = (-3)^5 \),而...

    C语言中的水仙花数,是指一个 n 位数,它的每个位上的数字的n次方之和等于它本身

    2. **分解数字**:将数字按照位数拆分成一个个独立的数字。 3. **计算和比较**:计算各个数字的 n 次幂之和,并与原数字进行比较。 #### 四、具体实现过程分析 以下是对示例代码的详细解读: ```c #include int...

    RSA加密(快速幂求余).pdf

    1. 将 `b` 拆分为二进制表示法:`b = p(n)*2^n + p(n-1)*2^(n-1) + ... + p(1)*2 + p(0)` 其中 `p(i)` 是 0 或 1 2. 计算 `a^b`:`a^b = a^(p(n)*2^n) * a^(p(n-1)*2^(n-1)) * ... * a^(p(1)*2) * a^p(0)` 3. 对...

    数字推理实战口诀.doc

    通过细致观察数列的递增或递减趋势,我们能够推测出数列可能遵循的规律,进而在例题2和例题3中找到正确的解题方向。 分数数列是数字推理中的另一个难点。面对分数数列时,我们可以将分数转化为负次幂来简化问题,...

    c_大整数乘法_大整数加法_e的x次幂_

    例如,对于两个大整数A和B,可以将其拆分为A = A1 * 2^n + A0,B = B1 * 2^n + B0,然后根据乘法规则得到C = (A1 * B1) * 2^(2n) + (A1 * B0 + A0 * B1) * 2^n + A0 * B0。这个过程可以递归进行,大大减少了运算量。...

    数学七年级下北师大版1.4幂的乘方与积的乘方同步练习精选.doc

    11. 复杂的乘方运算:如 ,这需要将复杂的乘方表达式拆分成简单部分,然后分别计算。 总结来说,这份练习涵盖了幂的乘方与积的乘方的基础概念,包括运算法则、等式变形、性质应用以及实际问题的解决。学生在完成...

    炫酷的jQuery二进制数字时钟.rar

    在这个项目中,时钟的小时、分钟和秒都会被拆分成二进制数,然后用CSS控制的背景颜色或字体颜色来表示每个位。例如,如果当前秒数是15,其二进制表示为0001111,那么在网页上会显示7个二进制位,前三位为0,后四位为...

    考前必看数字推理题的解题技巧大全技巧归纳.doc

    - 把数列中的数字拆分成各位,然后将各位数字相加或相乘,形成新的数列。例如,87, 57, 36, 19中,可以将每位数字相加得到新数列8+7, 5+7, 3+6, 1+9,即15, 12, 9, 10,从而推断出1作为下一项。 5. **隔项法** - ...

    数字的信息化表示1.pptx

    1字节等于8位,常用的数据存储单位还包括千字节(KB)、兆字节(MB)和吉字节(GB),它们之间的关系是2的幂次方倍。例如,1KB = 2^10 B,1MB = 2^20 B,1GB = 2^30 B。 ASCII码是用于表示英文字符的标准编码,它...

    快速幂_举例说明(3^11次方)

    快速幂的基本思想是将指数进行二进制拆分,然后根据二进制位上的数字(0或1)来决定是否将底数乘入结果中。具体步骤如下: 1. **初始化**:设`a`为底数,`b`为指数,`ans`表示最终的结果,初始值为1。 2. **循环...

Global site tag (gtag.js) - Google Analytics