3483. 2的幂次方(上海交通大学考研机试题目)

3483. 2的幂次方

⭐️难度:中等

⭐️类型:分治、递归

📖题目:题目链接

输入样例:

1315

输出样例:

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

🌟思路:

以题目例子为例:

总结:

1、只包含指数为0,1,2的数,

2、指数1不用写出来,

不难发现问题的解决符合:大问题拆分成若干相似的小问题,符合分治法 的思想。

步骤:

1️⃣先获得n的2指数形式

把数字转化成机器数,不难看出,获得任何一个数的2指数形式,只需要知道机器数中哪些比特是1

只需要与1相与,就能得出哪些比特是1。

n最大为20000,所以与n 相与机器数 最多是1000000000000000(15个0)

214=16384,215=32768

所以:214<20000<215

cpp 复制代码
string Get2sExponet(int n) {
    vector<int> exp;
    for (int i = 15;i >= 0;i--) {  // 先压入高次幂
        if ((n & (1 << i)) != 0) {
            exp.push_back(i);
        }
    }
    // n = 2^(exp[0] + 2^(exp[1]) + ... + 2^(exp[size - 1])
}

2️⃣构建结果字符串

每一个黑色部分都是一个小问题,

cpp 复制代码
tring Get2sExponet(int n) {
    if (n == 0) {
        return "0";
    }
    
    /*vector<int> exp;
    for (int i = 15; i >= 0; --i) {
        if ((n & (1 << i)) != 0) {
            exp.push_back(i);
        }
    }*/
    // n = 2^(exp[0]) + 2^(exp[1]) + ... + 2^(exp[size-1])
    
    string res = "";
    for (int i = 0; i < exp.size(); ++i) {
        if (i != 0) {
            res += "+";
        }
        if (exp[i] == 1) {  // 特殊:2^1^不用加()
            res += "2";
        }
        else {
            res += "2(" + Get2sExponet(exp[i]) + ")";
        }
    }
    return res;
}

📚题解:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<vector>  // vector不需要.h
#include<list>
#include<set>  // // 可以用 set 和 multiset
#include<unordered_set> // 可以用 unordered_set 和 unordered_multiset
#include<map>  // 可以用 map 和 multimap
#include<unordered_map> // 可以用 unordered_map 和 unordered_multimap
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
#include<stack>

using namespace std;

string Get2sExponet(int n) {
    if (n == 0) {
        return "0";  // 2^0^递归出口,0的次方不存在,返回本身
    }

    vector<int> exp;
    for (int i = 15; i >= 0; --i) {
        if ((n & (1 << i)) != 0) {  // 先压高次幂
            exp.push_back(i);
        }
    }
    // n = 2^(exp[0]) + 2^(exp[1]) + ... + 2^(exp[size-1])

    string res = "";
    for (int i = 0; i < exp.size(); ++i) {
        if (i != 0) {
            res += "+";
        }
        if (exp[i] == 1) {  // 2^1^递归出口,不用加()
            res += "2";
        }
        else { 
            res += "2(" + Get2sExponet(exp[i]) + ")";
        }
    }
    return res;
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("%s\n", Get2sExponet(n).c_str());
    }
  

    return 0;
}
相关推荐
老鼠只爱大米3 天前
LeetCode经典算法面试题 #70:爬楼梯(朴素递归、记忆化递归、动态规划等六种实现方案详解)
算法·leetcode·动态规划·递归·斐波那契·矩阵快速幂·爬楼梯
独断万古他化4 天前
【算法通关】二叉树中的深搜:DFS 递归解题套路
算法·二叉树·深度优先·dfs·递归
独断万古他化6 天前
【算法通关】递归:汉诺塔、合并链表、反转链表、两两交换、快速幂全解
数据结构·算法·链表·递归
进击的荆棘7 天前
优选算法——分治
数据结构·算法·leetcode·分治
阿里嘎多哈基米8 天前
速通Hot100-Day10——二叉树
算法·leetcode·二叉树·递归·平衡二叉树
A923A10 天前
【洛谷刷题 | 第五天】
算法·字符串·递归·洛谷
_小草鱼_11 天前
【搜索与图论】DFS算法(深度优先搜索)
算法·深度优先·图论·回溯·递归
百锦再12 天前
树形数据展示:树形表格与树形控件的深度对比(Vue实现)
javascript·vue.js·ecmascript·递归·tree·data·table
We་ct12 天前
LeetCode 53. 最大子数组和:两种高效解法(动态规划+分治)
前端·算法·leetcode·typescript·动态规划·分治
We་ct14 天前
LeetCode 427. 建立四叉树:递归思想的经典应用
前端·算法·leetcode·typescript·dfs·深度优先遍历·分治