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;
}
