GESP2026年6月认证C++二级( 第三部分编程题(1、完全平方数计数))精讲



第三部分 编程题第一题

《寻找神奇的平方宝石》


🏰 第一幕:平方王国的藏宝图

1、很久很久以前,有一个叫做平方王国的地方。

国王收藏着许多神奇宝石。

但是,并不是所有宝石都有资格进入宝库。

只有一种特殊的宝石才能进去。

它们叫做:

完全平方数!


2、国王告诉同学:

"给你两个数字 L 和 R。"

"请你帮我数一数,在这两个数字之间,一共有多少颗平方宝石?"


(1)例如:

复制代码
L = 1
R = 20

哪些是平方宝石呢?


(2)我们一个一个找。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

(3)其中:

复制代码
1 = 1×1

4 = 2×2

9 = 3×3

16 = 4×4

一共:

复制代码
4个

3、🌟 完全平方数的性质

完全平方数就是:

某个整数自己乘自己。

例如:

复制代码
1 = 1²

4 = 2²

9 = 3²

16 = 4²

25 = 5²

第二幕:最容易想到的方法

(1)"我把 L 到 R 全部暴力检查一遍!"

例如:

复制代码
100

101

102

......

100000

每个数字都判断是不是平方数。

枚举数字。


(2)接下来,怎么判断一个数是不是平方数?

例如:

复制代码
49

可以不停试:

复制代码
1²

2²

3²

...

7²

找到:

复制代码
7²=49

成功!


(3)可是......

如果:

复制代码
L=1

R=100000000

怎么办?

太慢了!


第三幕:我们发现了规律

1、平方数到底有哪些?

复制代码
1²=1

2²=4

3²=9

4²=16

5²=25

6²=36

7²=49

8²=64

9²=81

10²=100

2、我们可以,不断制造平方数!

这样速度就是超级快。


第四幕:制造平方宝石

1、现在我们制造:

复制代码
1²

2²

3²

4²

......

2、如果:

复制代码
平方数<R

继续。


3、如果:

复制代码
平方数>L

就开始计数。


4、例如:

复制代码
L=5

R=30

(1)制造:

复制代码
1²=1

太小

×

2²=4

太小

×

3²=9

√

4²=16

√

5²=25

√

6²=36

已经超过30

停止!

3、最后答案:

复制代码
3

是不是挺快的。


第五幕:怎样写循环呢?

1、代码:

复制代码
for(int i=1;i*i<=r;i++)

2、假设:

复制代码
R=100

那么:

复制代码
1²

2²

......

10²

就够了。

因为:

复制代码
11²=121

已经超过100。


3、所以:

循环条件就是:

复制代码
i*i<=R

意思:

只要平方没有超过R,就继续。


第六幕:什么时候计数呢?

1、制造出来以后:

(1)例如:

复制代码
i=5

得到:

复制代码
25

(2)判断:

复制代码
25>=L

如果成立。

说明:

25就在区间里面。

于是:

复制代码
ans++;

(3)如果:

复制代码
16

比L小。

说明:

不在藏宝区。

不能计数。


第七幕:参考代码

复制代码
#include <iostream>
using namespace std;

int main()
{
    int l, r;
    cin >> l >> r;

    int ans = 0;

    // 不断制造平方数
    for (int i = 1; i * i <= r; i++)
    {
        // 平方数进入区间
        if (i * i >= l)
            ans++;
    }

    cout << ans;

    return 0;
}

第八幕:逆向枚举

1、我们学会了一种编程思想。

以前:

复制代码
枚举每一个数字

后来:

复制代码
枚举答案的来源

这是:

逆向枚举(反向思考)


2、很多算法竞赛题都可以这样优化。

例如:

以前:

复制代码
检查队伍里面,每个人是不是冠军。

后来:

复制代码
直接找到冠军。

再看冠军在不在这个队伍里面。

🌟 本题知识树

复制代码
完全平方数
        │
        ├── 什么是平方数
        │
        ├── 暴力枚举数字(太慢)
        │
        ├── 枚举平方数(优化)
        │
        ├── i*i<=R 为什么?
        │
        ├── i*i>=L 为什么?
        │
        └── 逆向思维

🎁记忆口诀

判断平方数,数字全走完;
自己来造平方数,找到边界就停下。
枚举来源比枚举值,程序又快又简单!


相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码3 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++