参考程序1
#include <iostream>
using namespace std;
int main() {
int l, r, a, b, n, cnt = 0;
cin >> l >> r; // 读入区间左右端点
a = 1; // 从 2^0 = 1 开始
// 外层循环:枚举第一个幂 a = 2^x
while (a <= r) {
b = a; // 从 b = a 开始(即 x <= y,避免重复)
// 内层循环:枚举第二个幂 b = 2^y
while (b <= r) {
n = a + b; // 计算 n = 2^x + 2^y
if (n >= l && n <= r)
cnt++; // 若 n 在区间内,则为有效的幂和数
b *= 2; // 枚举下一个 2 的幂次
}
a *= 2; // 枚举下一个 2 的幂次
}
cout << cnt << endl; // 输出计数结果
return 0;
}
参考程序2
#include <iostream>
using namespace std;
int main() {
int l, r;
cin >> l >> r;
int cnt = 0;
// x 和 y 是指数(最多 14 次幂,2^14 = 16384 > 10000)
for (int x = 0; (1 << x) <= r; x++) {
for (int y = x; (1 << y) <= r; y++) {
int sum = (1 << x) + (1 << y); // 2^x + 2^y
if (sum >= l && sum <= r)
cnt++;
}
}
cout << cnt << endl;
return 0;
}