统计满足条件的 4 位数 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求统计若干个四位数中,满足“个位数字减去千位、百位、十位数字后大于零”的数的个数。核心解法是把每个四位数用整除与取模分离出四个数位,再逐个判定并累加计数。
分析
核心观察
一个四位数 的四个数位与
之间是确定的算术关系:千位是
,百位、十位依次是更高位整除后对
取模的结果,个位则直接是
。因此判定某一项是否计入答案,不需要把数当作字符串处理,四次整除取模即可。
思路
记四位数为 ,它的千位、百位、十位、个位分别为
题目要求的就是满足
的数的个数。注意条件是严格大于零,等号情形(如 的
满足,而
的
不满足)必须按题面判定,写成大于等于会多算。
处理方式是读入一个数就立刻拆位判定,用一个计数器 累计满足条件的个数,不需要保存整个序列,也不需要排序或额外统计——每个数的判定彼此独立,先读先判即可。
具体示例
以样例为例,,五个四位数依次为
:
| 数 | 千位 |
百位 |
十位 |
个位 |
是否计入 | |
|---|---|---|---|---|---|---|
| 否 | ||||||
| 是 | ||||||
| 是 | ||||||
| 否 | ||||||
| 是 |
三个数满足条件,输出 ,与样例一致。
算法步骤
- 读入四位数的个数
n,令计数器ans为。
- 重复
n次:读入一个四位数x。 - 用
x / 1000、x / 100 % 10、x / 10 % 10、x % 10取出千位、百位、十位、个位。 - 若个位减去其余三位之和的结果严格大于
,令
ans加。
- 输出
ans。
复杂度分析
- 时间:
。每个四位数只做常数次整除、取模与加减。
- 空间:
。只需要若干个整型变量,不必存储读入的数列。
实现注意事项
- 判定必须用严格大于零;等号情形不计入答案。
- 题面保证输入都是四位数,千位不会为零,因此可以放心地把最高位当作
x / 1000,无需特判前导零。 - 拆位时使用整除与取模即可,把整数转成字符串再逐字符判断虽然也可行,但多了一次类型转换开销。
,答案最大为
,
int足以容纳,输入输出用cin/cout即可。- 输入的数字分布在同一行或跨行给出都不影响
cin >>的读入,不必按行读入。
源代码
#include <iostream>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
int ans = 0;
for (int i = 0; i < n; ++i) {
int x;
std::cin >> x;
int a = x / 1000; // 千位
int b = x / 100 % 10; // 百位
int c = x / 10 % 10; // 十位
int d = x % 10; // 个位
if (d - a - b - c > 0) {
++ans;
}
}
std::cout << ans << '\n';
return 0;
}
import sys
def main():
data = sys.stdin.buffer.read().split()
n = int(data[0])
ans = 0
for i in range(n):
x = int(data[1 + i])
a = x // 1000 # 千位
b = x // 100 % 10 # 百位
c = x // 10 % 10 # 十位
d = x % 10 # 个位
if d - a - b - c > 0:
ans += 1
sys.stdout.write(str(ans) + "\n")
main()
评论