统计满足条件的 4 位数 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求统计若干个四位数中,满足“个位数字减去千位、百位、十位数字后大于零”的数的个数。核心解法是把每个四位数用整除与取模分离出四个数位,再逐个判定并累加计数。

分析
核心观察

一个四位数 x 的四个数位与 x 之间是确定的算术关系:千位是 \lfloor x / 1000 \rfloor,百位、十位依次是更高位整除后对 10 取模的结果,个位则直接是 x \bmod 10。因此判定某一项是否计入答案,不需要把数当作字符串处理,四次整除取模即可。

思路

记四位数为 x,它的千位、百位、十位、个位分别为

\displaystyle  a = \left\lfloor \frac{x}{1000} \right\rfloor,\quad b = \left\lfloor \frac{x}{100} \right\rfloor \bmod 10,\quad c = \left\lfloor \frac{x}{10} \right\rfloor \bmod 10,\quad d = x \bmod 10

题目要求的就是满足

\displaystyle  d - a - b - c > 0

的数的个数。注意条件是严格大于零,等号情形(如 1009 的 9-1-0-0=8 满足,而 1000 的 0-1-0-0=-1 不满足)必须按题面判定,写成大于等于会多算。

处理方式是读入一个数就立刻拆位判定,用一个计数器 ans 累计满足条件的个数,不需要保存整个序列,也不需要排序或额外统计——每个数的判定彼此独立,先读先判即可。

具体示例

以样例为例,n = 5,五个四位数依次为 1234, 1349, 6119, 2123, 5017:

数 千位 a 百位 b 十位 c 个位 d d-a-b-c 是否计入
1234 1 2 3 4 -2 否
1349 1 3 4 9 1 是
6119 6 1 1 9 1 是
2123 2 1 2 3 -2 否
5017 5 0 1 7 1 是

三个数满足条件,输出 3,与样例一致。

算法步骤
  1. 读入四位数的个数 n,令计数器 ans 为 0。
  2. 重复 n 次:读入一个四位数 x。
  3. 用 x / 1000、x / 100 % 10、x / 10 % 10、x % 10 取出千位、百位、十位、个位。
  4. 若个位减去其余三位之和的结果严格大于 0,令 ans 加 1。
  5. 输出 ans。
复杂度分析
  • 时间:O(n)。每个四位数只做常数次整除、取模与加减。
  • 空间:O(1)。只需要若干个整型变量,不必存储读入的数列。
实现注意事项
  • 判定必须用严格大于零;等号情形不计入答案。
  • 题面保证输入都是四位数,千位不会为零,因此可以放心地把最高位当作 x / 1000,无需特判前导零。
  • 拆位时使用整除与取模即可,把整数转成字符串再逐字符判断虽然也可行,但多了一次类型转换开销。
  • n \le 100,答案最大为 100,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()

评论

目前没有评论。