1 条题解

  • 0
    @ 2026-2-25 11:41:33

    这道题用递归分解的思路解决,核心是把“表示正整数”和“表示2的k次方”拆成两个递归步骤:

    1. 表示正整数t:把t拆成若干2的幂之和(如137=2⁷+2³+2⁰),按从大到小的顺序用+连接每个幂的表示。
    2. 表示2的k次方
      • 先输出2
      • 若k=0,补输出(0)
      • 若k>1,补输出(,然后递归“表示正整数k”,再补输出)
      • 若k=1,不用补输出(因为2¹就是2)。

    实现时,用位运算找t的二进制中为1的位(对应2的幂的指数k),按从高位到低位处理即可保证顺序正确。

    代码

    #include <iostream>
    using namespace std;
    
    void pp(int k);
    
    void pn(int t) {
        int k = 0, f = 1;
        while ((1 << (k + 1)) <= t) k++;
        for (int i = k; i >= 0; --i) {
            if (t & (1 << i)) {
                if (!f) cout << '+';
                f = 0;
                pp(i);
            }
        }
    }
    
    void pp(int k) {
        cout << '2';
        if (k == 0) cout << "(0)";
        else if (k > 1) {
            cout << '(';
            pn(k);
            cout << ')';
        }
    }
    
    int main() {
        int n;
        cin >> n;
        pn(n);
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    10
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    14
    已通过
    12
    上传者