2026年3月GESP真题及题解(C++五级):有限不循环小数

2026年3月GESP真题及题解(C++五级):有限不循环小数

题目描述

若 1 a \frac{1}{a} a1 可化为一个有限的,不循环的小数,则称 a a a 为终止数

请你求出在 L L L 到 R R R 中终止数的数量。

输入格式

输入一行,包含两个整数 L , R L,R L,R。

输出格式

输出一行,包含一个整数,表示 L L L 到 R R R 中终止数的数量。

输入输出样例 1
输入 1
复制代码
2 11
输出 1
复制代码
5
说明/提示
样例解释

在 [ 2 , 11 ] [2,11] [2,11] 终止数有 2 2 2、 4 4 4、 5 5 5、 8 8 8、 10 10 10。

数据范围

保证 1 ≤ L ≤ R ≤ 10 6 1 \le L \le R \le 10^6 1≤L≤R≤106。

思路分析

题目分析:

题目要求统计区间 [L, R] 内有多少个整数 a 使得 1 a \frac{1}{a} a1 是有限不循环小数。根据数学知识,一个最简分数化为有限小数的条件是分母的质因数只包含 2 和 5。由于 1 a \frac{1}{a} a1 已是最简形式,所以 a 必须能写成 2 i × 5 j 2^i \times 5^j 2i×5j 的形式,其中 (i, j) 是非负整数。

算法思路:

采用两层循环枚举所有可能的 2 i × 5 j 2^i \times 5^j 2i×5j 值,且保证不超过 R:

  • 外层循环枚举 2 的幂 i(从 1 开始,每次乘 2),代表 2 i 2^i 2i。
  • 内层循环枚举以当前 i 为基数,不断乘以 5,得到 i × 5 j i \times 5^j i×5j,即 2 i × 5 j 2^i \times 5^j 2i×5j。
  • 每次生成一个数时,判断是否大于等于 L,若是则计数。

代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int l, r, cnt = 0;  // l, r为区间端点,cnt统计终止数的个数

int main() {
    cin >> l >> r;  // 输入区间

    // 外层循环:枚举2的幂次,i = 2^0, 2^1, 2^2, ... 直到超过r
    for (int i = 1; i <= r; i *= 2) {
        // 内层循环:以当前i为基数,不断乘以5,得到 i*5^0, i*5^1, ... 直到超过r
        for (int j = i; j <= r; j *= 5) {
            if (j >= l) {  // 如果该数在区间内,则计数
                cnt++;
            }
        }
    }

    cout << cnt;  // 输出结果
    return 0;
}

功能分析

样例分析:

以样例输入 2 11 为例,程序生成的数依次为:

  • (i=1): 1 (小于 L 不计数), 5 (计数), 25 (大于 R 停止)
  • (i=2): 2 (计数), 10 (计数), 50 (停止)
  • (i=4): 4 (计数), 20 (停止)
  • (i=8): 8 (计数), 40 (停止)
  • (i=16): 大于 R,外层循环结束

最终计数得到 {5,2,10,4,8} 共 5 个数,输出 5,与题目样例一致。

时间复杂度:
  • 时间复杂度约为 O ( log ⁡ 2 R ⋅ log ⁡ 5 R ) O(\log_2 R \cdot \log_5 R) O(log2R⋅log5R),对于 R ≤ 10 6 R \leq 10^6 R≤106 完全可行(循环次数极少)

各种学习资料,助力大家一站式学习和提升!!!

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 点击跳转

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信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):
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;
}
相关推荐
m0_7167652318 小时前
数据结构--顺序表的插入、删除、查找详解
c语言·开发语言·数据结构·c++·学习·算法·visual studio
say_fall18 小时前
滑动窗口算法
数据结构·c++·算法
落羽的落羽18 小时前
【算法札记】练习 | Week1
linux·服务器·c++·人工智能·python·算法·机器学习
c++圈来了个新人18 小时前
C++类和对象(上)
c语言·开发语言·数据结构·c++·考研
️是7818 小时前
信息奥赛一本通(4005:【GESP2306一级】时间规划)
数据结构·c++·算法
tankeven18 小时前
HJ174 交换到最大
c++·算法
hope_wisdom18 小时前
C/C++数据结构之树
数据结构·c++·二叉树·
W230357657319 小时前
经典算法:打家劫舍(动态规划 + 回溯求最优解)C++ 超详细解析
c++·算法·动态规划
澈2071 天前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
A.A呐1 天前
【C++第二十九章】IO流
开发语言·c++