【GESP真题解析】第 15 集 GESP 二级 2024 年 6 月编程题 2:计数
发布时间
阅读量:
阅读量

大家好,我是莫小特。
这篇文章给大家分享 GESP 二级 2024 年 6 月编程题第 2 题:计数。
题目链接
洛谷链接:B4007 计数

一、完成输入
按照输入格式说明,在程序中读取两行数据。其中的数据范围为:两个正整数值n和k分别满足以下条件——数值n满足 1 \leq n \leq 1000;数值k满足 1 \leq k \leq 9。程序中使用int类型变量来存储这两个数值。
int n,k;
cin>>n>>k;
cpp
输入完毕后,接下来分析题意。
二、分析题意
在题目描述中,在小杨看来寻找属于自己的幸运数字是一个有趣的过程。当输入数据时,在n被设定为数值 30的情况下,在k被确定为数值 3时,则意味着从自然数序列中包含在内的是:3,6,9,…,一直到某个特定值的一组共8个这样的数字
也就是从 1 到 n 循环,并将数字拆分,找是否有 k。
for(int i=1;i<=n;i++)
{
}
cpp
单独为循环中的i值分配一个变量用于存储,并将该变量初始化为零。随后用于将输入数字分解为单个数值进行处理。若在分解后的数值中发现k存在,则计数器增加1
int cnt=0;
int p=i;
while(p!=0)
{
if(p%10==k)
{
cnt++;
}
p/=10;//p缩小
}
cpp

结合前面的代码:
int n,k;
cin>>n>>k;
int cnt=0;
for(int i=1;i<=n;i++)
{
int p=i;
while(p!=0)
{
if(p%10==k)
{
cnt++;
}
p/=10;//p缩小
}
}
cout<<cnt;
cpp

按照样例输入数据,测试。

符合样例的输入和输出,到网站提交。
三、验证数据
提交到网站中,通过!

四、完整代码
完整代码如下:
#include <iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int cnt=0;
for(int i=1;i<=n;i++)
{
int p=i;
while(p!=0)
{
if(p%10==k)
{
cnt++;
}
p/=10;//p缩小
}
}
cout<<cnt;
}
cpp

五、技巧总结
这是一道典型的 数位拆分 + 模拟统计类题目 ,考查基础逻辑与循环控制。
技巧一:逻辑理解
(1)依次处理每个介于1至n之间的整数值;
(2)将每个数字分解为各位数字,并逐一核对每一位是否与k相等;
(3)记录满足条件的数量作为统计结果。
技巧二:数位拆解
数位拆解常见做法是取模 + 整除:
while(n)
{
n%10;//取出个位
n/=10;//数字缩小
}
cpp
在问题求解过程中引入了一个辅助变量用于存储当前循环的起始值。由于循环中的变量i值会不断变化因此我们采用p=i的方式以避免i值被更改
int p = i; // 临时变量保存当前数
while(p != 0) {
if(p % 10 == k) cnt++; // 判断个位是否为 k
p /= 10; // 去掉最低位
}
cpp
如果对你有帮助,感谢点赞关注收藏哦~
全部评论 (0)
还没有任何评论哟~
