洛谷P1010 自我总结:递归和分治

P1010 幂次方

分治的核心是找到每一步的可能结果,不管是正推还是逆推。
在这个题当中每一步都有两种可能

  • 是2的幂次方
  • 不是2的幂次方

第一种情况对应着2(solve())的结构
第二种对应着寻找一个等比隔项求和式

先开始正因为没有定义清楚这个开头,所以导致了很多不必要的时间浪费

代码

#include <iostream>
using namespace std;
int a;
string res[20] = {"2(0)", "2"}, s = "2(", e = ")";
string solve(int k)
{
    int b = 1, bit = 0, flag = 0;
    while (b <= k)
        b <<= 1, bit++;
    b >>= 1, bit--;
    if (k == b)//如果是2的次方
        if (res[bit].size())
            return res[bit];
        else return res[bit] = s + solve(bit) + e;
    string tmp;
    while (k > 0)//如果不是。
    {
        if (flag)
            tmp += "+";
        k -= b;
        tmp += solve(b);
        flag = 1;
        while (b > k)
            b >>= 1, bit--;//注意这里是要进行多次位运算直到其小于原数。
    }
    return tmp;
}

int main()
{
    cin >> a;
    cout << solve(a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值