P1010 幂次方题解

题目传递门

一、解题思路

1、二进制表示法
为了知道一个数字是哪些2的幂组成,需要了解数字的二进制描述法,表示每一位是1还是0就可以知道如何用2的幂次方表示:
模板代码:

for (int i = 31; i >= 0; i--) //从大到小噢
    if ((n >> i) & 1) { //如果本位上有数字1
      此时可以分解出 2^i这个加法因子组成。
    }

2、为什么是递归?
因为可能第一步分解出来的东东,还存在比2的数字,可能需要继续分解,这时就可以考虑使用递归。比如 32=25,题目不让输出5,还需要继续化简成嵌套的表现方式。

3、递归的出口
20,21,22都是出口,但从23开始就不行了,需要继续递归。

4、数据范围
本题的范围是2104=20000,上限是215=32768,而214=16384就小于20000了,严格数据测试的话会WA掉,但本题出题人良心,没有给极限的测试数据,赞~

二、C++代码

#include <bits/stdc++.h>

using namespace std;
int n;

string dfs(int n) {
    if (n == 0) return "0";
    string res = "";

    //遍历二进制的每一位
    for (int i = 14; i >= 0; i--) {//从大到小噢
        //13最后一个点会WA,14可以AC
        //2^15=32768
        //2^14=16384
        //2^13=8192
        //2*10^4=2*10000=20000
        if ((n >> i) & 1) { //如果本位上有数字1
            if (i == 1)//2^1需要写成2的形式,这是递归的出口
                res += "2";
            else {
                //2^0,2^2,2^3...都需要写成2(n)的形式
                res += "2(";
                if (i > 2)//大于2的才需要再次分解,递归就可以了
                    res += dfs(i);
                else//这里处理0和2的情况,它俩是一样的处理方式2(0),2(2),也就是2(to_string(i))
                    res += to_string(i);
                //加上后扩号
                res += ")";
            }
            //利用+号拼接在一起
            res += "+";
        }
    }
    //控制是不是显示最后的+号
    if (res[res.size() - 1] == '+')res.pop_back();//最后一位是+号的,肯定是加多了,弹出去~
    return res;
}

int main() {
    cin >> n;
    cout << dfs(n) << endl;
    return 0;
}
posted @   糖豆爸爸  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2013-07-19 java连接mysql批量写入数据
Live2D
点击右上角即可分享
微信分享提示