题目要求将正整数 n 拆分为不同的 2 的正整数次幂(即 2k,k≥1)。关键点:
-1cpp1#include <iostream> 2#include <cstdio> 3using namespace std; 4 5int main() { 6 int n; 7 scanf("%d", &n); 8 9 // 奇数不存在优秀拆分(必然包含2^0) 10 if (n % 2 == 1) { 11 printf("-1"); 12 return 0; 13 } 14 15 int result[30] = {0}; // 存储拆分结果(10<sup>7<2</sup>24) 16 int count = 0; // 有效结果计数器 17 18 // 从低到高扫描二进制位 19 int pos = 0; // 当前位索引 20 while (n) { 21 if (n & 1) { // 当前位为1 22 int value = 1 << pos; // 计算2^pos 23 if (pos > 0) { // 跳过2^0 24 result[count++] = value; 25 } 26 } 27 pos++; 28 n >>= 1; // 右移处理下一位 29 } 30 31 // 从大到小输出结果 32 for (int i = count - 1; i >= 0; i--) { 33 printf("%d", result[i]); 34 if (i > 0) printf(" "); 35 } 36 37 return 0; 38}
代码解释:
n & 1 检测当前最低位是否为 11 << pos 计算 2pos 的值pos>0 保证只取正整数次幂)python1import sys 2 3def main(): 4 n = int(sys.stdin.readline().strip()) 5 6 # 奇数直接返回-1 7 if n % 2 == 1: 8 print("-1") 9 return 10 11 res = [] # 存储拆分结果 12 pos = 0 # 当前位索引 13 14 # 从低到高扫描二进制位 15 while n: 16 if n & 1: # 当前位为1 17 value = 1 << pos # 计算2^pos 18 if pos > 0: # 跳过2^0 19 res.append(value) 20 pos += 1 21 n //= 2 # 等价于n >>= 1 22 23 # 逆序输出(从大到小) 24 if res: 25 print(" ".join(map(str, reversed(res)))) 26 else: # 理论不会触发(n>=2的偶数至少含1个有效位) 27 print("-1") 28 29if __name__ == "__main__": 30 main()
代码解释:
reversed() 替代显式逆序循环//2 替代位右移(效果相同)n & 1 进行位检测1 << pos 计算幂值n //= 2 移除已处理位map(str, reversed(res)) 快速生成逆序字符串| 维度 | C++ 实现 | Python 实现 |
|---|---|---|
| 时间复杂度 | O(logn) | O(logn) |
| 空间复杂度 | O(logn) | O(logn) |
| 位运算效率 | 原生CPU指令支持 | 解释器优化 |
| 适用场景 | 极限性能竞赛 | 快速原型开发 |
选择建议: