#include <iostream>
using namespace std;

int main() {
    // 定义变量:
    // l 和 r:要判断的区间范围 [l, r]
    // a 和 b:用于表示幂数(2的幂次方数,如1,2,4,8...)
    // n:两个幂数相加的结果
    // cnt:计数器,统计在区间内的幂和数个数
    int l, r, a, b, n, cnt = 0;
    
    // 读入区间范围
    cin >> l >> r;
    
    // 第一个幂数a从1开始(2^0)
    a = 1;
    
    // 外层循环:遍历所有可能的第一个幂数a
    // 条件:a不超过区间的上限r
    while (a <= r) {
        // 第二个幂数b从当前的a开始
        b = a;
        
        // 内层循环:遍历所有可能的第二个幂数b
        // 条件:b不超过区间的上限r
        while (b <= r) {
            // 计算两个幂数的和
            n = a + b;
            
            // 判断这个和是否在目标区间内
            if (n >= l && n <= r) {
                cnt++;  // 如果在区间内,计数器加1
            }
            
            // b乘以2,得到下一个更大的幂数(如2→4→8)
            b *= 2;
        }
        
        // a乘以2,得到下一个更大的幂数(如1→2→4)
        a *= 2;
    }
    
    // 输出区间内幂和数的总个数
    cout << cnt << endl;
    
    return 0;
}

代码思维解析(适合小学生理解)

  1. 什么是幂和数? 幂数:像1, 2, 4, 8, 16...这样翻倍增长的数字(2的幂次方)

幂和数:两个幂数相加的结果(如1+2=3, 2+2=4, 1+4=5)

  1. 解题思路(像做游戏一样简单!) 准备阶段:

画一个数字区间(比如从5到20)

准备两套相同的"幂数卡片":1,2,4,8...

配对游戏:

从第一套卡片取一张(比如1)

从第二套卡片取不小于第一张的卡片(1,2,4...)

把两张卡片数字相加(1+1=2, 1+2=3, 1+4=5...)

如果和在目标区间内就记一分

换卡片规则:

第二套卡片用完后,换第一套的下一张(1→2)

第二套重新从新卡片开始(2→2,4...)

直到所有卡片组合都试过

  1. 关键技巧 翻倍增长:每次a*=2和b*=2就像卡片翻倍(1→2→4→8)

避免重复:b从a开始保证不重复(如先1+2,不会再有2+1)

区间判断:只记录在l和r之间的和

0 条评论

目前还没有评论...