探索数字的不同方式的数量可以表示为2的幂的总和

时间:2017-01-13 04:22:47

标签: computer-science combinatorics discrete-mathematics

将f(0)= 1和f(n)定义为不同方式的数量n可以表示为2的整数幂之和,每次幂不超过两次。例如,f(10)=因为有五种不同的表达方式10:

  1. 1 + 1 + 8
  2. 1 + 1 + 4 + 4
  3. 1 + 1 + 2 + 2 + 4
  4. 2 + 4 + 4
  5. 2 + 8
  6. 给定n的f(n)是什么,你可以使用任何计算机语言。

    import math
    def powOfTwo(n):
        i=0
        while(pow(2,i)<=n):
            if (pow(2,i)==n):
                return True
            else:
                i=i+1
        return False
    
    def noWays(n):   
        if n==1:
            return 1
        elif n==0:
            return 0
        else:
            if (n%2==0):
                if (powOfTwo(n-2) and n-2!=2):                
                    return (1+noWays((n-2)/2)+noWays(n/2))
                else:
                    return (noWays((n-2)/2)+noWays(n/2))
            else:
                if (powOfTwo(n-1)and n-1!=2):
                    return (1+noWays((n-1)/2))
                else:
                    return (noWays((n-1)/2))
    n=int(input())
    v=noWays(n)
    print(v)
    

1 个答案:

答案 0 :(得分:1)

通常,对于这些类型的谜题,您只需要以不同的方式提出问题。

  

给定起始编号,通过减去2的幂,可以将多少种方法转换为零?您可以将每个数字减去零,一次或两次。

使函数签名采用以下参数:

  • n:您尝试转换为零的数字
  • p:允许减去的最小数量

算法如下所示。 (在手稿中)

function pathsToZero(n: number, p:number) : number {
     if(n === 0) {
        // We've hit the target!
        return 1;
     }
     if(n < p) {
        // This will only be negative. No point in continuing
        return 0;
     }
     return pathsToZero(n, p*2) + pathsToZero(n-p, p*2) + pathsToZero(n-p*2, p*2);
} 


let resultForTen = pathsToZero(10, 1);