文章

【GESP】C++一级练习 luogu-B2078, 含 k 个 3 的数

GESP一级循环和基本运算练习,但是相比普通的题来说,略有难度,难度★✮☆☆☆。

luogu-B2078

题目要求

题目描述

输入两个正整数 $m$ 和 $k$,其中 $1 \lt m \leq 10^{15}$,$1 \lt k \leq 15$ ,判断 $m$ 是否恰好含有 $k$ 个 $3$,如果满足条件,则输出 YES,否则,输出 NO

输入格式

输入一行,为两个整数 $m,k$,中间用单个空格间隔。

输出格式

满足条件,则输出 YES,否则,输出 NO

样例输入 #1

1
43833 3

样例输出 #1

1
YES

题目分析

  1. 首先,我们需要直接处理输入的正整数 $m$,通过对 $m$ 进行取模和整除操作逐位检查每个数字。
  2. 在检查每个数字的同时,我们需要维护一个计数器,用于统计数字 3 的出现次数。
  3. 当我们遍历完所有数字后,比较计数器的值与输入的正整数 $k$,如果相等则输出 YES,否则输出 NO

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream> // 引入输入输出流库
using namespace std;

int main() {
    long long m, k; // 定义两个长整型变量 m 和 k
    cin >> m >> k; // 从标准输入读取两个正整数 m 和 k
    int ans = 0; // 初始化计数器 ans,用于统计数字 3 的个数

    while (true) { // 无限循环,直到手动中断
        if (m % 10 == 3) { // 检查当前最低位是否为 3
            ans++; // 如果是 3,计数器加 1
        }
        m /= 10; // 去掉最低位,继续检查下一位
        if (m == 0) { // 如果 m 变为 0,说明所有位数都已检查完
            break; // 退出循环
        }
    }

    if (ans == k) { // 检查计数器 ans 是否等于 k
        cout << "YES"; // 如果相等,输出 "YES"
    } else {
        cout << "NO"; // 否则,输出 "NO"
    }
    return 0; // 返回 0,表示程序正常结束
}

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

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

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