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;
}
相关推荐
Amnesia0_01 小时前
C++中的IO流
开发语言·c++
2401_891482172 小时前
C++模块化编程指南
开发语言·c++·算法
暮冬-  Gentle°2 小时前
自定义类型转换机制
开发语言·c++·算法
2301_816651222 小时前
嵌入式C++低功耗设计
开发语言·c++·算法
qq_416018722 小时前
分布式缓存一致性
开发语言·c++·算法
干啥啥不行,秃头第一名2 小时前
STL容器内部实现剖析
开发语言·c++·算法
xiaoye-duck2 小时前
《算法题讲解指南:动态规划算法--简单多状态dp问题》--13.删除并获得点数,14.粉刷房子
c++·算法·动态规划
2401_831824962 小时前
内存泄漏检测与防范
开发语言·c++·算法
liuyao_xianhui3 小时前
优选算法_分治_快速排序_归并排序_C++
开发语言·数据结构·c++·算法·leetcode·排序算法·动态规划