整数分解为2的幂数之和

问题:任何整数必定能分解成2的幂之和,给定整数n,求n的此类分解方法的数量。

2的幂有:1,2,4,8,16,32,64,128......除了1是奇数之外,其他全部为偶数。

比如n = 7时,共有6种分解方法。
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

思路:很显然要采用从小到大的递推方法。
f(1) = 1

f(2m+1) = f(2m)   因为奇数整数2m+1的每种分解方式中都必然含有至少一个1,当把每种分解方式都去掉1时,就得到2m的分解方式,而且2m不会再有其他分解方式,否则2m+1也会再有的。

f(2m) = f(2m-1) + f(m)  偶数整数2m的分解方式中可能有1,也可能没有1。如果有1,那一定会有偶数个1。现在把有1和无1分成两部分。
    先看有1的那部分,当把这部分里每个分解方式都去掉1,就得到2m-1的分解方式,并且2m-1不会再有其他分解方式,否则2m也会再有的。
    然后再看无1的那部分,因为没有1,所以所有的分解方式都全是2的倍数,当把这部分里每种分解方式都除以2时,这就相当于全是m的分解方式。

由上面两个递推式加上初始条件,即可由n求出f(n)。

void main()
{
	int n;
	cin>>n;
	int *A = new int[n+1]; //动态数组
	A[1] = 1;
	for(int i=2;i<n;i++)
	{
		if(i%2)
			A[i] = A[i-1];
		else
			A[i] = A[i-1] + A[i/2];
	}
	cout<<"F("<<n<<") = "<<A[n-1]<<endl;
	delete[] A;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值