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       
共有6种方法。1+2+4和2+1+4认为是同一个等式,因为它们的组成相同。
现在小明想要知道,给出一个十进制数,可以写出多少种,用若干个2的幂数相加的式子。

输入

第一行包含1个正整数n, 1<=n<=1000。

输出

共1行,n能用2的幂数相加的不同式子的种数。

样例输入

7

样例输出

6

提示

来源

[ 提交][ 状态]
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int fun(int n)
{
    int ans;
    if(n==2)
        return 2;
    if(n%2==0)
        ans=fun(n/2)+fun(n-1);
    else if(n%2!=0)
    {
        ans=fun(n-1);
    }
    return ans;
}
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",fun(n));
    return 0;
}

### C++ 中计算 2次方的方法 在 C++ 编程中,可以通过多种方法来判断或表示一个是否为 2次方。以下是几种常见的实现方式: #### 方法一:通过递归分解表达式 可以利用递归来将任意正整拆解成多个 2次方之和的形式。这种方法的核心思想是不断寻找当前值对应的最大的 2次方,并将其余部分继续递归处理。 ```cpp #include <iostream> using namespace std; void two(int n) { int a[15]; a[0] = 1; for (int i = 1; i < 15; ++i) { a[i] = 2 * a[i - 1]; } int k; for (k = 14; k >= 0; --k) { if (a[k] <= n) break; } if (k == 0) cout << "2(0)"; else if (k == 1) cout << "2"; else if (k == 2) cout << "2(2)"; else { cout << "2("; two(k); cout << ")"; } if (a[k] < n) { cout << "+"; two(n - a[k]); } } int main() { int n; cin >> n; two(n); return 0; } ``` 上述代码实现了将输入的正整 `n` 表达为一系列 2次方相加的结果[^1]。 --- #### 方法二:位运算检测是否为 2次方 对于给定的一个整 `v`,如果它是 2次方,则其二进制形式仅有一个比特位为 1。因此,可以用 `(v & (v - 1)) == 0` 来快速验证这一点。 ```cpp template <typename T, class = std::enable_if_t<std::is_integral_v<T>>> inline bool is_power_of_two(T v) { return v && !(v & (v - 1)); } ``` 此模板函适用于任何整型据类型(如 `int`, `long long`),并能高效地判断该值是否为 2次方[^2]。 --- #### 方法三:直接生成指定范围内的所有 2次方 有时可能需要预先计算一定范围内所有的 2次方值列表。这可以通过简单的循环完成: ```cpp const int MAX_POWER = 30; // 假设最大指不超过 30 vector<int> powersOfTwo(MAX_POWER + 1); for (int i = 0; i <= MAX_POWER; ++i) { powersOfTwo[i] = 1 << i; // 使用左移操作符计算 2^i } ``` 这里使用了按位左移操作符 (`<<`) 来代替乘法运算,从而更简洁明了地得到各个次方结果[^3]。 --- ### 总结 以上三种方法分别展示了如何用 C++ 实现不同场景下的 2次方相关功能——从复杂递归表达到简单高效的布尔判定以及批量预计算存储。每种技术都有各自适用场合,在实际开发过程中可根据具体需求灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值