Advertisement

【GESP真题解析】第 15 集 GESP 二级 2024 年 6 月编程题 2:计数

阅读量:
image.png

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

题目链接

洛谷链接:B4007 计数

image.png

一、完成输入

按照输入格式说明,在程序中读取两行数据。其中的数据范围为:两个正整数值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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/mCEH7jLWfw2luK8oGS9JObvnrF5N.png)

结合前面的代码:

复制代码
    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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/f5RjQKFZ4GxhUiOluq6H2VWgA8t9.png)

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

image.png

符合样例的输入和输出,到网站提交。

三、验证数据

提交到网站中,通过!

image.png

四、完整代码

完整代码如下:

复制代码
    #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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/eypkqBlHRNOM8UgAoZLciudvGh27.png)

五、技巧总结

这是一道典型的 数位拆分 + 模拟统计类题目 ,考查基础逻辑与循环控制。

技巧一:逻辑理解
(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)

还没有任何评论哟~