GESP2024年6月认证C++二级( 第三部分编程题(2)计数 )


🟦 题目名称:计数


🌈 一、先看题目:

1、题目说:

小杨有一个"幸运数字" k(保证是 0~9 之间的数字)。

现在给你一个整数 n。


2、问:

👉 从 1 到 n 所有数字里

👉 数字 k 一共出现了多少次?


🧸 二、举例说明:

1、比如:

cpp 复制代码
n = 25
k = 2

2、我们要看:

从 1 到 25 里面

数字"2"出现了几次?


3、我们来数一数 👀

cpp 复制代码
1
2   ← 1次
3
...
10
11
12  ← 1次
...
20  ← 1次
21  ← 1次
22  ← 2次
23  ← 1次
24  ← 1次
25  ← 1次

4、统计一下:

  • 2 (1次)

  • 12(1次)

  • 20(1次)

  • 21(1次)

  • 22(2次)

  • 23(1次)

  • 24(1次)

  • 25(1次)


5、总共:

1 + 1 + 1 +1+ 2+1+1+1 = 9次


6、所以答案是:

cpp 复制代码
9

🧠 三、算法步骤:

1、我们要做两件事:

(1)第一步

遍历:

cpp 复制代码
for (i = 1 到 n)

(2)第二步

检查每一个数里面:

数字 k 出现了几次?


🧮 四、怎么检查一个数的"每一位"?

1、比如:

1234


2、怎么一位一位拆?

方法是:

cpp 复制代码
% 10  → 取最后一位
/ 10  → 去掉最后一位

3、🎯 举例:123

(1)第一次:

cpp 复制代码
123 % 10 = 3
123 / 10 = 12

(2)第二次:

cpp 复制代码
12 % 10 = 2
12 / 10 = 1

(3)第三次:

cpp 复制代码
1 % 10 = 1
1 / 10 = 0

(4)结束!


💻 五、参考程序:

cpp 复制代码
#include <iostream>
using namespace std;
int check(int x, int y) {
    int cnt = 0;
    while (x > 0) {
        int tmp = x % 10;
        if (tmp == y) {
        cnt++;
    }
    x = x / 10;
    }
    return cnt;
}
int main() {
    int n, k;
    cin >> n >> k;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        ans += check(i, k);
    }
    cout << ans << endl;
    return 0;
}

💻 六、代码讲解:

cpp 复制代码
int check(int x, int y) {
    int cnt = 0;
    while (x > 0) {
        int tmp = x % 10;
        if (tmp == y) {
            cnt++;
        }
        x = x / 10;
    }
    return cnt;
}

(1)🧠 这段代码意思是:

函数 check:

返回:

👉 数字 x 里面

👉 数字 y 出现了多少次?


(2)主程序讲解

cpp 复制代码
int main() {
    int n, k;
    cin >> n >> k;
    int ans = 0;
    
    for (int i = 1; i <= n; i++) {
        ans += check(i, k);
    }
    
    cout << ans << endl;
}

意思是:

从 1 到 n

把每个数里 k 出现的次数加起来。


🏆 七、超简写法(不用函数)

cpp 复制代码
#include<iostream>
using namespace std;

int main(){
    int n, k;
    cin >> n >> k;
    int ans = 0;
    
    for(int i=1;i<=n;i++){
        int x = i;
        while(x){
            if(x%10 == k)
                ans++;
            x /= 10;
        }
    }
    
    cout << ans;
}

🌈 八、总结

步骤 做什么
1 遍历 1~n
2 拆分每个数
3 比较每一位
4 有K就累加
5 输出最后结果

🌟 九、本题考点

这题是典型的:

✅ for 循环

✅ 数字拆位

✅ % 和 / 的使用

✅ 累加统计

数字拆分是二级考试必考!学生需要完全掌握!


附:🎯 拆数算法(模版大全)


🌈 一、什么叫"拆数"?

1、比如数字:

cpp 复制代码
12345

2、我们要把它拆成:

cpp 复制代码
5
4
3
2
1

3、怎么拆?

秘诀只有两个操作:

cpp 复制代码
% 10   取最后一位
/ 10   去掉最后一位

🧠 二、万能拆数模板

cpp 复制代码
while(n > 0){
    int digit = n % 10;  // 取最后一位
    
    // 在这里处理 digit
    
    n /= 10;             // 去掉最后一位
}

🌟 这是必背模板!


🎯 三、常见题型 + 模板讲解


1、各位数字之和

(1)题目:

输入 123,输出 6


(2)模板代码

cpp 复制代码
int sum = 0;
while(n > 0){
    sum += n % 10;
    n /= 10;
}
cout << sum;

2、 统计某个数字出现次数

(1)比如:

cpp 复制代码
n = 12232   k = 2
统计 k 出现几次

(2)模板代码

cpp 复制代码
int count = 0;
while(n > 0){
    if(n % 10 == k)
        count++;
    n /= 10;
}

3、判断是否包含某个数字

(1)例如:

是否包含 7


(2)模板代码

cpp 复制代码
bool found = false;
while(n > 0){
    if(n % 10 == 7){
        found = true;
        break;
    }
    n /= 10;
}

4、反转数字(经典)

(1)例如:

输入:

123

输出:

321


(2)模板代码

cpp 复制代码
int rev = 0;
while(n > 0){
    rev = rev * 10 + n % 10;
    n /= 10;
}

5、 判断回文数

(1)例如:

121 是回文


(2)模板代码

cpp 复制代码
int original = n;
int rev = 0;

while(n > 0){
    rev = rev * 10 + n % 10;
    n /= 10;
}

if(original == rev)
    cout << "Yes";
else
    cout << "No";

🌟 四、拆数加强版(处理 0 的情况)

1、有时题目会给:

cpp 复制代码
n 可能等于 0

2、模板代码

cpp 复制代码
if(n == 0){
    // 单独处理
}

while(n > 0){
    ...
}

🌟 五、支持负数版本

cpp 复制代码
n = abs(n);

while(n > 0){
    ...
}

🌟 六、拆数算法的核心思想

cpp 复制代码
每次取最低位
处理
删除最低位
重复

这是一种:

👉 循环结构

👉 数学运算

👉 模拟过程


🌟 七、考试常见变形

GESP二级常考:

  • 统计幸运数字

  • 统计区间数字

  • 各位求和(乘积)

  • 数字转置

  • 计数问题

几乎都是拆数问题。


相关推荐
王老师青少年编程1 小时前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(选择题11-15)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
今儿敲了吗1 小时前
23| 画展
c++·笔记·学习·算法
Desirediscipline3 小时前
#define _CRT_SECURE_NO_WARNINGS 1
开发语言·数据结构·c++·算法·c#·github·visual studio
ShineWinsu3 小时前
对于C++中map和multimap的详细介绍
c++·面试·stl·笔试·map·红黑树·multimap
Once_day4 小时前
GCC编译(3)常见编译选项
c语言·c++·编译和链接
肆忆_5 小时前
Day 02|控制块分离架构:Boost 风格 shared_ptr 骨架落地
c++
lightqjx5 小时前
【C++】C++11 常见特性
开发语言·c++·c++11
tankeven6 小时前
HJ92 在字符串中找出连续最长的数字串
c++·算法
艾莉丝努力练剑6 小时前
【Linux:文件】进程间通信
linux·运维·服务器·c语言·网络·c++·人工智能