10分钟掌握:用Chrome DevTools调试JavaScript面试题终极指南
2026/5/1 15:30:22
✨幂和数
如果一个数N
可以写成
两个 2 的幂相加比如:
N = 2^a + 2^b那么,N 就是幂和数!
🎯在一个范围 [L, R] 里,找出一共有多少个幂和数
2 的幂?就是一直乘 2:
| 写法 | 数字 |
|---|---|
| 2⁰ | 1 |
| 2¹ | 2 |
| 2² | 4 |
| 2³ | 8 |
| 2⁴ | 16 |
| 2⁵ | 32 |
从 1 开始,一直 ×2
3 = 1 + 2 → ✔ 幂和数
5 = 1 + 4 → ✔
6 = 2 + 4 → ✔
7 ❌(不是两个 2 的幂相加)
L R👉 从L 到 R
👉 数一数
👉 有多少个数
👉 可以写成2^a + 2^b
对每个数 N
再去试所有 a、b
看能不能拼出来
❌ 太慢!
❌ 太乱!
❌ 容易写炸!
👉不是去猜 N
👉 而是:
先生成所有的
2^a + 2^b再看看它落不落在
[L, R]里
2^a + 2^b?a 从1开始,一直 ×2 (外循环)
b 从a开始,一直 ×2 (内循环)
只要和<= R,就继续
L = 2, R = 102、所有 2 的幂:
1, 2, 4, 83、组成幂和数:
| a | b | a+b |
|---|---|---|
| 1 | 1 | 2 |
| 1 | 2 | 3 |
| 1 | 4 | 5 |
| 1 | 8 | 9 |
| 2 | 2 | 4 |
| 2 | 4 | 6 |
| 2 | 8 | 10 |
| 4 | 4 | 8 |
👉 一共8 个
#include <iostream> using namespace std; int main() { int L, R; cin >> L >> R; int cnt = 0; // 第一个 2 的幂 for (int a = 1; a <= R; a *= 2) { // 第二个 2 的幂(从 a 开始,防止重复) for (int b = a; b <= R; b *= 2) { int sum = a + b; // 如果在范围内,就计数 if (sum >= L && sum <= R) { cnt++; } } } cout << cnt << endl; return 0; }a *= 2?for (int a = 1; a <= R; a *= 2)👉 表示:
1 → 2 → 4 → 8 → 16 …
b = a开始?for (int b = a; b <= R; b *= 2)👉 防止:
1 + 2
2 + 1
被算两次 ❗
❌ 写成a++(直接错)
❌b从 1 开始(会重复)
❌ 忘了判断sum <= R
❌ 用pow()(浮点数,危险)
📌
幂 = 从 1 开始 ×2
幂和数 = 两个幂相加
思路:先造,再筛
防重复:第二个从第一个开始