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 为什么?
        │
        └── 逆向思维

🎁记忆口诀

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


相关推荐
wuminyu1 小时前
markword在高并发场景下变化剖析
java·linux·c语言·jvm·c++
星夜夏空991 小时前
C++学习(1) ——C与C++
c语言·c++·学习
旖-旎1 小时前
QT界面优化(6)
开发语言·c++·qt
UP_Continue2 小时前
AutoCAD--图形命令和选项
c++·autopilot
零点零一2 小时前
QT 5升级到 Qt 6 使用 Clazy 检查将 C++ 应用程序移植到 Qt 6
开发语言·c++·qt
爱奥尼欧2 小时前
轻量级可扩展日志框架-异步日志与系统集成
开发语言·数据库·c++·学习
爱奥尼欧2 小时前
轻量级可扩展日志框架-日志落地与日志器模块实现
jvm·数据库·c++
我不是懒洋洋2 小时前
从零实现一个加密库:AES与RSA
c++
Huangjin007_3 小时前
【C++11篇(二)】右值引用、移动语义保姆级讲解!
开发语言·c++