LG1010 幂次方

题目描述

任何一个正整数都可以用2的幂次方表示。例如

137=2^7+2^3+2^0         

同时约定方次用括号来表示,即a^b 可表示为a(b)。

由此可知,137可表示为:

2(7)+2(3)+2(0)

进一步:7= 22+2+20 (2^1用2表示)

3=2+2^0   

所以最后137可表示为:

2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

1315=2^10 +2^8 +2^5 +2+1

所以1315最后可表示为:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入输出格式

输入格式:

  • 一个正整数n(n≤20000)。

输出格式:

  • 符合约定的n的0,2表示(在表示中不能有空格)

输入输出样例

输入样例#1:

1315

输出样例#1:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

/* P1010 幂次方
 * Au: GG
 */
#include <bits/stdc++.h>
using namespace std;
string M[6];
int n;

inline int lowbit(int x) {
    return x & (-x);
}
int count(int x) {
    if (!x) return 0;
    int cnt = 0; x >>= 1;
    while (x > 0) x >>= 1, cnt++;
    return cnt;
}
string solve(int x) {
    if (!M[x].empty()) return M[x];

    string str;
    while (lowbit(x)) {
        if (!str.empty()) {
            if (lowbit(x) == 2)
                str = "2+" + str;
            else
                str = "2(" + solve(count(lowbit(x))) + ")+" + str;
        }
        else {
            if (lowbit(x) == 2)
                str = "2";
            else
                str = "2(" + solve(count(lowbit(x))) + ')';
        }
        x -= lowbit(x);
    }
    return str;
}

int main() {
    cin >> n; M[0] = "0";
    M[1] = "2(0)"; M[2] = "2";
    M[3] = "2+2(0)"; M[4] = "2(2)";
    cout << solve(n) << endl;
    return 0;
}

Post author 作者: Grey
Copyright Notice 版权说明: Except where otherwise noted, all content of this blog is licensed under a CC BY-NC-SA 4.0 International license. 除非另有说明,本博客上的所有文章均受 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 保护。
原文地址:https://www.cnblogs.com/greyqz/p/7301560.html