GESP二级的练习,常常会考察对多层循环和分支判断的综合运用能力。今天我们来分析一道来自洛谷“语言月赛”的题目——luogu-B3699 [语言月赛202301] 就要 62,它的难度并不高,但对于巩固基础逻辑和数字处理技巧很有帮助。
题目描述
给你一个整数 x,你需要判断,这个整数中是否出现过数字 或者 能够被 62 整除。如果是,输出 Yes,否则输出 No 即可。
输入格式
输入共一行,为一个整数 x。
输出格式
输出共一行。
如果 x 中出现过数字 62 或者能够被 62 整除,输出一行 Yes,否则输出一行 No。
输入 #1
11624
输出 #1
Yes
输入 #2
12214
输出 #2
Yes
输入 #3
16124
输出 #3
No
输入 #4
62
输出 #4
Yes
说明/提示
样例 1 解释
显然,11624 中出现了 62。
样例 2 解释
容易知道,12214 / 62 = 197,所以 12214 可以被 62 整除。
样例 3 解释
虽然 16124 中出现了 6 和 2,但是没有出现一个完整的 62。这种情况不被叫做【出现 62】。
样例 4 解释
显然,62 中出现了 62,也是 62 的倍数。
数据规模与约定
对于 $100\%$ 的测试数据,保证 $1 \le x \le 10^{18}$。
解题思路分析
这道题目的要求非常明确:对于一个给定的正整数 x,只需满足“能被62整除”或“其十进制表示中包含连续的‘62’”这两个条件中的任意一个,即输出 Yes。
我们的解题思路可以清晰地分为两步,这在处理许多条件判断类问题时是一个很好的编程思维模式。
-
第一步:判断整除条件
这是最简单直接的一步。利用取余运算符 % 即可完成。如果 x % 62 == 0 成立,那么无需进行后续判断,直接输出 Yes 并结束程序。
-
第二步:判断是否包含连续数字“62”
如果第一步不成立,我们就需要检查数字的每一位。一个高效的方法是:
- 用一个临时变量
temp 来操作原始数字 x。
- 在循环中,不断检查
temp % 100 的结果是否等于 62。temp % 100 可以取出 temp 的最后两位数字。
- 如果等于
62,说明找到了,输出 Yes 并结束。
- 如果不等于,则通过
temp /= 10 去掉 temp 的最后一位(相当于将数字整体右移一位),继续检查新的最后两位。
- 重复此过程,直到
temp 变为 0(所有数位都已检查完毕)为止。
如果以上两个条件都不满足,则最终输出 No。
这个思路完美地覆盖了题目的所有要求,并且逻辑清晰,易于用 C/C++ 代码实现。
示例代码 (C++)
下面是根据上述思路编写的C++代码。代码中包含了清晰的注释,帮助你理解每一步的操作。
#include<iostream>
using namespace std;
int main(){
long long x;
cin >> x;
// 条件一:判断原始数字是否能被 62 整除
if (x % 62 == 0) {
cout << "Yes" << endl;
return 0;
}
// 条件二:通过循环逐位判断是否包含连续的 "62"
long long temp = x;
while (temp > 0) {
// 判断当前数字末两位是否为 62
if (temp % 100 == 62) {
cout << "Yes" << endl;
return 0;
}
// 去掉末尾一位数字,继续向左检查
temp /= 10;
}
// 两个条件均未满足,输出 No
cout << "No" << endl;
return 0;
}
代码要点解析
- 数据类型:由于
x 最大可达 $10^{18}$,超出了 int 型的范围,因此我们使用 long long 类型来存储。
- 提前返回:在判断出满足条件后,使用
return 0; 直接结束 main 函数,这是一种避免使用冗余标志变量的简洁写法。
- 循环条件:
while (temp > 0) 确保当数字的所有位都被检查过后(temp 变成 0)循环停止。
- 取位技巧:
temp % 100 和 temp /= 10 是处理整数各位数字的经典组合,需要熟练掌握。
总结与延伸
这道题本质上是条件判断与基础算法中数字位运算的结合。通过解决它,你可以巩固以下知识点:
- 取模运算 (
%) 的应用。
- 整数除法的截断特性在数字分解中的应用。
- 循环与条件分支的嵌套使用。
- 问题拆解的思路:将“或”关系的复杂条件,分解为独立的、可按顺序检查的简单子问题。
在准备 GESP 或类似认证时,多练习此类题目能有效提升你的逻辑思维和编码熟练度。你可以尝试在云栈社区与其他开发者交流更多解题技巧和学习资源,共同进步。
|