今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1 1 1,我们称满足这样条件的年份为特殊年份。
输入 5 5 5 个年份,请计算这里面有多少个特殊年份。
输入 5 5 5 行,每行一个 4 4 4 位十进制数(数值范围为 1000 1000 1000 至 9999 9999 9999),表示一个年份。
输出一个整数,表示输入的 5 5 5 个年份中有多少个特殊年份。
2019
2021
1920
2120
9899
2
【样例说明】
2021 和 9899 是特殊年份,其它不是特殊年份。
蓝桥杯 2021 第二轮省赛 B 组 F 题。
直接通过 字符串索引 访问各位字符,利用 ASCII码运算 简化逻辑。无需数学计算,适合竞赛快速编码。
#include
using namespace std;
int main() {
int ans = 0;
for (int i = 0; i < 5; ++i) {
string s;
cin >> s;
// 千位s[0] == 十位s[2] 且 个位s[3] == 百位s[1]+1
if (s[0] == s[2] && s[3] == s[1] + 1)
ans++;
}
cout << ans << endl;
return 0;
}
字符索引
:四位数年份作为字符串输入,索引对应关系:
s = "2021"
s[0] → '2' (千位)
s[1] → '0' (百位)
s[2] → '2' (十位)
s[3] → '1' (个位)
ASCII码运算: s[3] == s[1] + 1
等效于数值运算: 个位数值=百位数值+1个位数值=百位数值+1
通过 数学运算 分解四位数,逐位提取数值。逻辑清晰,适合教学或理解位数处理原理。
#include
using namespace std;
int main() {
int ans = 0;
for (int i = 0; i < 5; ++i) {
int year;
cin >> year;
// 数学拆解各位数值
int thousand = year / 1000; // 千位
int hundred = (year / 100) % 10; // 百位
int ten = (year / 10) % 10; // 十位
int one = year % 10; // 个位
// 判断条件
if (thousand == ten && one == hundred + 1)
ans++;
}
cout << ans << endl;
return 0;
}
千位=⌊year1000⌋
百位=⌊year100⌋%10
十位=⌊year10⌋% 10
个位=year% 10
维度 | 字符串解析法 | 数值拆解法 |
---|---|---|
运算效率 | ⚡ 更优(无除法/取模) | ⏳ 稍慢(需多次数学运算) |
代码可读性 | 需理解ASCII码运算 | 直观展示数学逻辑 |
适用场景 | 竞赛快速解题 | 教学/需明确数学逻辑 |
内存占用 | O(1) | O(1) |
2019 → 2≠1 ❌
2021 → 2=2 ✔️, 1=0+1 ✔️
1920 → 1≠2 ❌
2120 → 2=2 ✔️, 0≠1+1 ❌
9899 → 9=9 ✔️, 9=8+1 ✔️
输入加速
(C++):
ios::sync_with_stdio(false); // 关闭同步流
cin.tie(0); // 解除cin与cout绑定
防御性编程
:
if (s.length() != 4) { // 确保输入合法性
cerr << "Invalid input!";
continue;
}
数位 | 数学公式 | 示例(2021) |
---|---|---|
千位 | year / 1000 |
2021/1000=2 |
百位 | (year / 100) % 10 |
(2021/100)=20 → 20%10=0 |
十位 | (year / 10) % 10 |
(2021/10)=202 → 202%10=2 |
个位 | year % 10 |
2021%10=1 |
竞赛场景优先字符串解析法,追求极致效率;
教学场景推荐数值拆解法,深入理解数学逻辑。