巧妙思维: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的幂数的主要内容,如果未能解决你的问题,请参考以下文章

[E数学] lc326. 3的幂(数学+约数+思维)

[E数学] lc326. 3的幂(数学+约数+思维)

[E数学] lc326. 3的幂(数学+约数+思维)

AGC 043 B - 123 Triangle (数学 思维巧妙)

整数拆分为若干个2的幂数相加

HDU6623 思维题(n分解成质因子的形式,问最小的幂是多少)