【题目链接】
一本通 4124 幂和数 洛谷 B4357 幂和数
【题目考点】
1. 循环结构(嵌套); 2. 枚举法; 3. 幂运算(pow函数); 4. 标记法;
【解题逻辑】
1. 定义变量 sum 并初始化为 0,用于统计 l~r 之间的幂和数个数; 2. 枚举l~r之间的每一个数字i:
- 初始化标记变量 f=0(表示默认 i 不是幂和数);
- 嵌套枚举两个 2 的次幂(j 和 k 的范围 0~13,因
=8192,
=16384 已超出规定数据范围); - 计算两个 2 的次幂之和 s1+s2,若等于当前数字 i,则将标记 f 设为 1 并跳出内层循环;
3. 若数字 i 的标记 f=1(是幂和数),则 sum 加 1; 4. 遍历完成后,输出统计结果 sum;
【题解代码】
1. 输入两个整数 l 和 r:代表需要判断的数字范围;
int l,r;
cin>>l>>r;
int sum=0;
2. 遍历 l~r 之间的每个数字,判断是否为幂和数;
for(int i=l;i<=r;i++){
int f=0;// 标记变量:0表示不是幂和数,1表示是
// 枚举第一个2的次幂(j从0到13,2^13=8192满足常规范围)
for(int j=0;j<=13;j++){
int s1=pow(2,j);// 计算2的j次幂
// 枚举第二个2的次幂(k从0到13)
for(int k=0;k<=13;k++){
int s2=pow(2,k);// 计算2的k次幂
if(s1+s2==i){// 两个2的次幂和等于i,说明是幂和数
f=1;// 标记为是幂和数
break;// 找到符合条件的组合,跳出内层循环
}
}
// 优化:若已找到符合条件的组合,无需继续枚举j
if(f==1) break;
}
if(f==1){// 是幂和数则计数+1
sum++;
}
}
3. 输出统计结果;
cout<<sum;



