本问题要求将正整数递归分解为2的幂次方的表示形式。核心挑战在于:
输出"2(" → 递归处理i → 输出")"cpp1#include<iostream> 2#include<cmath> 3using namespace std; 4 5// 递归分解函数:将x表示为2的幂次方组合 6void fff(int x) { 7 // 从2<sup>14(16384)到2</sup>0(1)枚举可能的幂次 8 for (int i = 14; i >= 0; i--) { 9 int power_val = pow(2, i); // O(1)计算幂值 10 11 if (power_val <= x) { // 找到当前可用的最大幂次 12 if (i == 1) { // 特殊处理2^1 13 cout << "2"; 14 } else if (i == 0) { // 特殊处理2^0 15 cout << "2(0)"; 16 } else { // 递归处理指数部分 17 cout << "2("; 18 fff(i); // 递归分解指数 19 cout << ")"; 20 } 21 22 x -= power_val; // 减去已处理部分 23 if (x != 0) { // 剩余部分非空时添加连接符 24 cout << "+"; 25 } 26 } 27 } 28} 29 30int main() { 31 int n; 32 cin >> n; // 读取输入值 33 fff(n); // 开始递归分解 34 return 0; 35}
代码解释:
fff(int x) 处理整数x的分解python1def fff(x): 2 # 从2<sup>14(16384)到2</sup>0(1)倒序枚举幂次 3 for i in range(14, -1, -1): # O(15)循环 4 power_val = 2 ** i # 计算幂值 5 6 if power_val <= x: # 找到当前可用最大幂次 7 if i == 1: # 特殊处理2^1 8 print("2", end="") 9 elif i == 0: # 特殊处理2^0 10 print("2(0)", end="") 11 else: # 递归处理指数部分 12 print("2(", end="") 13 fff(i) # 递归分解指数 14 print(")", end="") 15 16 x -= power_val # 更新剩余值 17 if x != 0: # 剩余部分非空时添加连接符 18 print("+", end="") 19 20def main(): 21 import sys 22 n = int(sys.stdin.read()) # 读取输入值 23 fff(n) # 开始递归分解 24 25if __name__ == "__main__": 26 main()
代码解释:
range(14, -1, -1) 实现倒序枚举end="" 参数避免换行输出** 运算符替代 pow()sys.stdin.read() 读取单行输入| 维度 | C++实现 | Python3实现 |
|---|---|---|
| 时间复杂度 | O((logn)2) | O((logn)2) |
| 空间复杂度 | O(logn) | O(logn) |
| 运行效率 | 编译执行效率高 | 解释执行效率较低 |
| 代码简洁度 | 需显式类型声明 | 动态类型更简洁 |
选择建议:
两种实现均通过样例验证(输入1315输出匹配),算法逻辑完全一致。Python实现避免了C++特有语法(如指针),符合题目要求。