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二级常考:

  • 统计幸运数字

  • 统计区间数字

  • 各位求和(乘积)

  • 数字转置

  • 计数问题

几乎都是拆数问题。


相关推荐
王维同学2 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
Scott9999HH3 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
脱胎换骨-军哥3 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
旖-旎5 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
胖大和尚6 小时前
C++ 多线程编程的实现方式
c++·thread
在水一缸7 小时前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
2401_841495647 小时前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂
斐夷所非8 小时前
在纷繁竞逐中稳步前行:C++ 2006–2020
c++
保持清醒5409 小时前
类和对象上
c++
乱七八糟的屋子9 小时前
Poco C++高级实战教程:线程池+日志系统+加密算法+WebSocket长连接
c++·websocket·加密解密·#poco·#c++高级开发