洛谷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);
}

猜你喜欢

转载自blog.csdn.net/weixin_45502929/article/details/106326105