1. 题目来源
链接:3483. 2的幂次方
2. 题目解析
一道经典题目,原题。
dfs
思路:以 137=2^7+2^3+2^0
为例。2^7
要将 7 单独拿出来看,即 7=2^2+2+2^0
。故这就递归起来了。
string dfs(int n)
返回 n
的 2 的幂次方的表示形式。
从高位到低位扫描 n
的比特位,若当前比特位为 0,则不需要考虑。若为 1,则为 2^i
那么同理需要递归处理 i
的 2 的幂次方表示形式。
注意递归边界,2^0=2(0)
、2^1=2
故 i=0、i =1
的时候需要特殊处理,作为递归出口。
递归分析的不准确,log log log (n)
差不多就是 O(1)
了。
时间复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn)
空间复杂度:
O
(
1
)
O(1)
O(1)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
string dfs(int n) {
string res;
for (int i = 20; ~i; i -- ) { // i 貌似从 14 开始即可
if (n >> i & 1) {
if (res.size()) res += '+'; // 每两项需要加号间隔
if (i == 0) res += "2(0)";
else if (i == 1) res += "2";
else res += "2(" + dfs(i) + ")";
}
}
return res;
}
int main() {
while (~scanf("%d", &n)) {
cout << dfs(n) << endl;
}
return 0;
}