将n写为2的幂的总和的方法的数量

时间:2012-11-20 21:04:55

标签: algorithm math

有没有算法可以找出写一个数字的方法有多少,例如n,幂的总和为2?

示例:对于4,有四种方式:

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

感谢。

3 个答案:

答案 0 :(得分:3)

假设g(m)是将m作为2的幂之和写入的方式的数量。我们使用f(m,k)来表示将m作为2的幂的总和写入的方式的数量。数字的幂小于或等于k。然后我们可以减少到等式:

if m==0 f(m,k)=1;    
if k<0 f(m,k)=0;    
if k==0 f(m,k)=1;    
if m>=power(2,k) f(m,k)=f(m-power(2,k),k)+f(m,k-1);//we can use power(2,k) as one of the numbers or not.    
else f(m,k)=f(m,k-1);

以6为例:

g(6)=f(6,2)
=f(2,2)+f(6,1)
=f(2,1)+f(4,1)+f(6,0)
=f(0,1)+f(2,0)+f(2,1)+f(4,0)+1
=1+1+f(0,1)+f(2,0)+1+1
=1+1+1+1+1+1
=6

以下是代码:

#include<iostream>
using namespace std;

int log2(int n)
{
    int ret = 0;
    while (n>>=1) 
    {
        ++ret;      
    }
    return ret;
}

int power(int x,int y)
{
    int ret=1,i=0;
    while(i<y)
    {
        ret*=x;
        i++;
    }
    return ret;
}

int getcount(int m,int k)
{
    if(m==0)return 1;
    if(k<0)return 0;
    if(k==0)return 1;
    if(m>=power(2,k))return getcount(m-power(2,k),k)+getcount(m,k-1);
    else return getcount(m,k-1);

}

int main()
{
    int m=0;
    while(cin>>m)
    {
        int k=log2(m);
        cout<<getcount(m,k)<<endl;
    }
    return 0;
}

希望它有所帮助!

答案 1 :(得分:2)

序列的递归定义(从Peter的链接到A018819):

f(n) = 1 if n = 0, Sum(j = 0..[n/2], f(j)) if n > 0 http://mathurl.com/nuaarfm.png

答案 2 :(得分:0)

您想找到将数字表示为2的幂的和的方式。 首先,您需要找到该特定编号中的编号设置位,因为设置位的数量将为我们提供将其表示为2的幂的和所需的最小数量。 将其表示为2的幂的和所需的最大数字将是数字本身,因为您可以将其表示为1的总和(因为2的0为1的幂)。 示例:5可以表示为(1 + 1 + 1 + 1 + 1)

因此,表达数字的方式总数为2的幂,只需通过公式即可->  让no成为x                 (x-x中没有设置位的位数)+ 1; 例如,让数字为17 则17中的设置位数为2 因此没有办法(17-2)+ 1 = 16;