巧妙思维:2的幂数
Posted baoyihan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了巧妙思维:2的幂数相关的知识,希望对你有一定的参考价值。
小明开始学习二进制转化到十进制,其中要用到2的幂(2的3次幂就是3个2相乘),他觉得这个很有意思。既然通过2的幂相加可以得到十位数,那么反过来,一个十进制数是否可以通过若干个2的幂相加得到呢?
小明开始研究起来,他先列出了所有2的幂:1,2,4,8,16,32,64……。
4=1+1+1+1
4=1+1+2
4=2+2
4=4
4共有4种方法
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+2+2
7=1+1+1+4
7=1+2+2+2
7=1+2+4
7共有6种方法
1+2+4和2+1+4认为是同一个等式,因为它们的组成相同。
现在小明想要知道,给出一个十进制数(不超过10000),可以写出多少种,用若干个2的幂数相加的式子。
思路:
1.如果n是奇数,则f[n]=f[n-1](一定要分个1出来,所以它的结果就等于偶数n-1的结果)
2.如果n是偶数,则考虑将它拆分为带1和不带1两种情况:
(1)带1:这种情况下种数为f[n-1](也就是奇数n-1的结果)
(2)不带1:这种情况下种数为f[n/2](很巧妙,分出来不带1的情况下肯定分出来的数每个都是偶数,这种情况下的种数可以等价于n/2的种数,因为把分出来的数都除以2不就是n/2分出来的数吗?)
综上:有递推公式:n为奇时,f[n]=f[n-1];n为偶时,f[n]=f[n-1]+f[n/2];
此外,还要注意n==1时,直接初始化f[1]=1。
#include <cstdio>
int f[1010];
int main()
int n;
scanf("%d", &n);
f[1] = 1;
for(int i = 2; i <= n; i++)
if(i % 2 != 0) f[i] = f[i - 1];
else f[i] = f[i-1] + f[i/2];
printf("%d\n",f[n]);
return 0;
以上是关于巧妙思维:2的幂数的主要内容,如果未能解决你的问题,请参考以下文章