2026年6月GESP真题及题解(C++二级):完全平方数计数

题目描述
小杨同学正在研究完全平方数。
平方: 一个数的平方等于这个数乘以这个数本身。
完全平方数: 指可以恰好表示为某个正整数的平方的数。
例如, 9 9 9 是完全平方数,因为 9 = 3 2 = 3 × 3 9 = 3^2 = 3 \times 3 9=32=3×3;但 27 27 27 不是,因为 27 27 27 不能表示为任何正整数的平方。
给定两个正整数 l l l 和 r r r(保证 l ≤ r l \le r l≤r),小杨同学想知道 l l l 到 r r r 之间的所有正整数中(包含 l l l 和 r r r),有多少个数是完全平方数。
输入格式
输入两行,第一行为一个正整数 l l l,第二行为一个正整数 r r r。
输出格式
输出一个非负整数,表示 l l l 到 r r r 中,有多少个正整数是完全平方数。如果 l l l 到 r r r 中没有完全平方数,则输出 0 0 0。
输入输出样例 1
输入 1
1
21
输出 1
4
说明/提示
样例解释 1
在 1 1 1 到 21 21 21 中,有以下 4 4 4 个整数是完全平方数:
1 , 4 , 9 , 16 1, 4, 9, 16 1,4,9,16。
数据范围
1 ≤ l ≤ r ≤ 2000 1 \le l \le r \le 2000 1≤l≤r≤2000。
思路分析(方法1)
完全平方数即某个正整数 k 的平方 k²。给定区间 [l, r],我们需要统计满足 l ≤ k² ≤ r 的整数 k 的个数。
由于 r ≤ 2000,k 的最大值不超过 ⌊ 2000 \sqrt{2000} 2000 ⌋ = 44(因为 44² = 1936 ≤ 2000,45² = 2025 > 2000)。因此我们可以枚举 k 从 1 开始,计算 k²,只要 k² ≤ r 就继续。对于每个平方数,判断它是否 ≥ l,若是则计数器加一。
代码实现(方法1)
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int l, r;//定义左右边界
cin >> l >> r;//输入l和r
int ans = 0; //答案计数器
for (int i = 1; i * i <= r; ++i) { //枚举正整数i,直到i²>r
if (i * i >= l) ++ans; //若平方数在区间内则计数
}
cout << ans;//输出结果
return 0;
}
功能分析(方法1)
-
输入处理 :从标准输入读取两个正整数
l和r,保证l ≤ r。 -
枚举平方数 :循环变量
i从 1 开始,每次检查i*i是否超过r,若超过则停止。由于i递增,平方数也递增,因此不会遗漏。 -
区间判定 :对每个平方数
i*i,只需判断其是否 ≥l,因为循环条件已保证它 ≤r,所以满足条件的平方数一定在区间内。 -
输出结果 :输出计数器
ans,该值即为区间内完全平方数的个数。若不存在,则ans保持 0,输出 0。
思路分析(方法2)
本题要求统计区间
[l, r]内完全平方数的个数。完全平方数是指能表示为某个正整数平方的数。最直观的做法是枚举区间内的每一个整数
i,然后判断它是否为完全平方数。判断方法:计算i的平方根并向下取整得到y,若y * y == i,则i是完全平方数。因为
r ≤ 2000,枚举最多 2000 次,每次判断为常数时间,完全可行。代码实现(方法2)
cpp#include<bits/stdc++.h> using namespace std; int l,r,cnt=0;//左右边界和计数器 //check函数:判断x是否为完全平方数 bool check(int x){ int y=sqrt(x);//取平方根整数部分 return y*y==x;//判断平方是否等于原数 } int main(){ cin>>l>>r;//读入区间 for(int i=l;i<=r;i++){//枚举每个整数 if(check(i)) cnt++;//计数完全平方数 } cout<<cnt; return 0; }功能分析(方法2)
- 输入处理 :从标准输入读取两个正整数
l和r,保证l ≤ r。 - 核心逻辑 :
- 自定义函数
check(x)利用sqrt和误差修正判断x是否为完全平方数。 - 主函数中循环遍历
[l, r]内的所有整数,调用check并累计满足条件的个数。
- 自定义函数
- 输出 :打印计数器
cnt,即为区间内完全平方数的数量。若无,则输出0。
- 输入处理 :从标准输入读取两个正整数
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}
