1 条题解
-
0
这道题用递归分解的思路解决,核心是把“表示正整数”和“表示2的k次方”拆成两个递归步骤:
- 表示正整数t:把t拆成若干2的幂之和(如137=2⁷+2³+2⁰),按从大到小的顺序用
+连接每个幂的表示。 - 表示2的k次方:
- 先输出
2; - 若k=0,补输出
(0); - 若k>1,补输出
(,然后递归“表示正整数k”,再补输出); - 若k=1,不用补输出(因为2¹就是
2)。
- 先输出
实现时,用位运算找t的二进制中为1的位(对应2的幂的指数k),按从高位到低位处理即可保证顺序正确。
代码
#include <iostream> using namespace std; void pp(int k); void pn(int t) { int k = 0, f = 1; while ((1 << (k + 1)) <= t) k++; for (int i = k; i >= 0; --i) { if (t & (1 << i)) { if (!f) cout << '+'; f = 0; pp(i); } } } void pp(int k) { cout << '2'; if (k == 0) cout << "(0)"; else if (k > 1) { cout << '('; pn(k); cout << ')'; } } int main() { int n; cin >> n; pn(n); cout << endl; return 0; } - 表示正整数t:把t拆成若干2的幂之和(如137=2⁷+2³+2⁰),按从大到小的顺序用
- 1
信息
- ID
- 10
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 14
- 已通过
- 12
- 上传者
京公网安备 11011102002149号