2026年6月GESP真题及题解(C++二级):完全平方数计数
题目描述小杨同学正在研究完全平方数。
平方: 一个数的平方等于这个数乘以这个数本身。 完全平方数: 指可以恰好表示为某个正整数的平方的数。 例如,9 99是完全平方数,因为9 = 3 2 = 3 × 3 9 = 3^2 = 3 \times 39=32=3×3;但27 2727不是,因为27 2727 不能表示为任何正整数的平方。 给定两个正整数l ll和r rr(保证l ≤ r l \le rl≤r),小杨同学想知道l ll到r rr之间的所有正整数中(包含l ll和r rr ),有多少个数是完全平方数。 输入两行,第一行为一个正整数l ll,第二行为一个正整数r rr 。 输出一个非负整数,表示l ll到r rr中,有多少个正整数是完全平方数。如果l ll到r rr中没有完全平方数,则输出0 00 。 在1 11到21 2121中,有以下4 44个整数是完全平方数: 1 , 4 , 9 , 16 1, 4, 9, 161,4,9,16。 1 ≤ l ≤ r ≤ 2000 1 \le l \le r \le 20001≤l≤r≤2000 。 完全平方数即某个正整数 的个数。 由于 ,若是则计数器加一。 输入处理:从标准输入读取两个正整数 。 枚举平方数:循环变量 递增,平方数也递增,因此不会遗漏。 区间判定:对每个平方数 ,所以满足条件的平方数一定在区间内。 输出结果:输出计数器 保持 0,输出 0。 本题要求统计区间 内完全平方数的个数。完全平方数是指能表示为某个正整数平方的数。 最直观的做法是枚举区间内的每一个整数 是完全平方数。 因为 ,枚举最多 2000 次,每次判断为常数时间,完全可行。 https://edu.csdn.net/lecturer/7901 点击跳转 https://edu.csdn.net/course/detail/40437 点击跳转 https://edu.csdn.net/course/detail/41081 点击跳转 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 点击跳转 信奥赛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 点击跳转 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 点击跳转
输出 11 21
说明/提示样例解释 14思路分析(方法1)
k的平方k²。给定区间[l, r],我们需要统计满足l ≤ k² ≤ r的整数kr ≤ 2000,k的最大值不超过 ⌊2000 \sqrt{2000}2000⌋ = 44(因为 44² = 1936 ≤ 2000,45² = 2025 > 2000)。因此我们可以枚举k从 1 开始,计算k²,只要k² ≤ r就继续。对于每个平方数,判断它是否 ≥l代码实现(方法1)
#includeusingnamespacestd;intmain(){intl,r;//定义左右边界cin>>l>>r;//输入l和rintans=0;//答案计数器for(inti=1;i*i<=r;++i){//枚举正整数i,直到i²>rif(i*i>=l)++ans;//若平方数在区间内则计数}cout<<ans;//输出结果return0;}功能分析(方法1)
l和r,保证l ≤ ri从 1 开始,每次检查i*i是否超过r,若超过则停止。由于ii*i,只需判断其是否 ≥l,因为循环条件已保证它 ≤rans,该值即为区间内完全平方数的个数。若不存在,则ans思路分析(方法2)
[l, r]i,然后判断它是否为完全平方数。判断方法:计算i的平方根并向下取整得到y,若y * y == i,则ir ≤ 2000代码实现(方法2)
#includeusingnamespacestd;intl,r,cnt=0;//左右边界和计数器//check函数:判断x是否为完全平方数boolcheck(intx){inty=sqrt(x);//取平方根整数部分returny*y==x;//判断平方是否等于原数}intmain(){cin>>l>>r;//读入区间for(inti=l;i<=r;i++){//枚举每个整数if(check(i))cnt++;//计数完全平方数}cout<<cnt;return0;}功能分析(方法2)
l和r,保证l ≤ r。check(x)利用sqrt和误差修正判断x是否为完全平方数。[l, r]内的所有整数,调用check并累计满足条件的个数。cnt,即为区间内完全平方数的数量。若无,则输出0。各种学习资料,助力大家一站式学习和提升!!!
#includeusingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):2、CSP信奥赛C++竞赛拿奖视频课:3、csp信奥赛高频考点知识详解及案例实践:4、csp信奥赛冲刺一等奖有效刷题题解:5、GESP C++考级真题题解:· 文末祝福 ·
#includeusingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}