2026年【江苏“信息与未来”编程思维】真题及题解(T1:幸运数字)
题目描述
如果一个正整数的十进制表示中,每种数字都恰好出现了偶数次,Dr. X 就认为它是幸运数字。例如:
-
11
11
11 是幸运数字,数字1
1
1 出现了2
2
2 次 (偶数次)。 -
131131
131131
131131 是幸运数字,数字1
1
1 出现了4
4
4 次,数字3
3
3 出现了2
2
2 次,都是偶数次。 -
23333
23333
23333 不是幸运数字,因为数字2
2
2 出现了1
1
1 次 (奇数次)。 -
123
123
123 不是幸运数字,因为数字1
1
1、2
2
2、3
3
3 各出现了1
1
1 次 (奇数次)。
给定两个正整数
a
a
a 和
b
b
b,请你计算
a
,
a
+
1
,
a
+
2
,
…
,
b
a, a+1, a+2, \\ldots, b
a,a+1,a+2,…,b 中幸运数字的数量。
输入格式
输入两个空格分隔的正整数
a
a
a 和
b
b
b。
输出格式
输出一个整数,表示
a
,
a
+
1
,
a
+
2
,
…
,
b
a, a+1, a+2, \\ldots, b
a,a+1,a+2,…,b 中幸运数字的数量。
输入输出样例 1
输入 1
1 100
输出 1
9
输入输出样例 2
输入 2
1 10000
输出 2
261
说明/提示
- 在
1
1
1 和100
100
100 之间,幸运数字有11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
11, 22, 33, 44, 55, 66, 77, 88, 99
11,22,33,44,55,66,77,88,99。
数据规模
- 对于
100
%
100\\%
100% 的数据,满足1
≤
a
≤
b
≤
1
,
000
,
000
1 \\le a \\le b \\le 1,000,000
1≤a≤b≤1,000,000。
思路分析
问题转化 题目要求统计区间 [a, b] 内所有满足“十进制表示中每种数字(0~9)出现的次数均为偶数”的正整数。 由于 b ≤ 1,000,000,最大只有 7 位数字,直接枚举区间内的每个数并检查其每一位的统计信息,时间复杂度约为 (b-a+1)×7 ≤ 7×10⁶,完全可行,不需要任何高级优化。
判断方法 对于给定的整数 x:
复杂度
- 时间:O((b-a+1) × log₁₀ b),最坏约 7×10⁶ 次操作。
- 空间:O(1),仅需常数个计数数组。
代码实现
#include <bits/stdc++.h>
using namespace std;
bool ck(int x){ // 判断 x 是否为幸运数字
int c[10]={0};// 计数数组,c[d] 表示数字 d 出现的次数
while(x){ // 当 x 不为 0 时循环
c[x%10]++; // 提取个位并累加
x/=10; // 去掉个位
}
for(int i=0;i<10;i++) // 检查所有数字 0~9
if(c[i]%2==1) return false;// 若出现奇数次,则不是幸运数字
return true; // 全部偶数,是幸运数字
}
int main(){
int a,b;
cin>>a>>b; // 读入区间端点
int ans=0; // 计数器
for(int i=a;i<=b;i++) // 枚举区间内每个整数
if(ck(i)) ans++; // 如果是幸运数字,答案加 1
cout<<ans; // 输出结果
return 0;
}
功能分析
- 函数 ck:接收一个正整数,返回布尔值表示它是否为幸运数字。
- 内部使用长度为 10 的数组统计每个数字出现的次数。
- 通过取模运算 %2==1 判断奇偶性,逻辑清晰且易于理解。
- 主函数:
- 读取 a 和 b,保证 a ≤ b。
- 循环遍历区间,累加满足条件的个数。
- 输出最终答案,类型为 int 足够(最大区间长度为 10⁶,答案不会超过 10⁶)。
正确性保证 对于任意正整数,算法都会完整提取其所有十进制位并进行奇偶校验。由于枚举了区间内所有数,不会遗漏或重复统计,因此结果正确。
性能 在最大数据范围下,执行约 700 万次简单循环,在 C++ 下远小于 1 秒。
更多内容请关注专栏:信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转 
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信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解: https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):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 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}



