文章

【GESP】C++二级练习 luogu-t259142, 数数字

GESP二级练习,涉及多层条件和循环嵌套,难度★✮☆☆☆。

luogu-t259142

题目要求

题目描述

试计算在区间 $1$ 到 $n$ 的所有整数中,数字 $x$($0\le x\le9$)共出现了多少次?例如,在 $1$ 到 $11$ 中,即在 $1,2,3,4,5,6,7,8,9,10,11$ 中,数字 $1$ 出现了 $4$ 次。

输入格式

$2$ 个整数 $n,x$,之间用一个空格隔开。

输出格式

$1$ 个整数,表示 $x$ 出现的次数。

样例输入 #1

1
11 1

样例输出 #1

1
4

数据范围

对于 $100\%$ 的数据,$1\le n\le 10^6$,$0\le x \le 9$。


题目分析

在这道题中,我们需要统计数字 $x$ 在区间 $1$ 到 $n$ 的所有整数中出现的次数。我们可以通过遍历从 $1$ 到 $n$ 的所有整数,并对每个整数进行分解,统计其中包含 $x$ 的次数。

首先,我们需要读取输入的两个整数 $n$ 和 $x$。然后,我们使用一个循环遍历从 $1$ 到 $n$ 的所有整数。在每次循环中,我们对当前整数进行分解,统计其中包含 $x$ 的次数。我们可以通过对整数进行模运算(%)和除法(/)来实现分解。

在分解过程中,如果当前整数的最后一位数字等于 $x$,我们就将计数器 $ans$ 自增 $1$。最后,我们输出计数器 $ans$ 的值,即数字 $x$ 在区间 $1$ 到 $n$ 的所有整数中出现的次数。

需要注意的是,这道题的时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。因此,这道题的解法是非常高效的,可以处理大规模的输入数据。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main() {
    int n, x, ans = 0; // 定义变量n、x和计数器ans
    cin >> n >> x; // 读取输入的n和x
    for (int i = 1; i <= n; i++) { // 外层循环,从1到n遍历所有整数
        int tmp = i, num; // 定义临时变量tmp和num
        while (tmp != 0) { // 内层循环,对当前整数进行分解
            num = tmp % 10; // 获取当前整数的最后一位数字
            if (num == x) // 如果最后一位数字等于x
                ans++; // 计数器自增1
            tmp = tmp / 10; // 移除当前整数的最后一位数字
        }
    }
    cout << ans; // 输出计数器ans的值,即数字x出现的次数
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权