洛谷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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章