1961:【13NOIP普及组】计数问题

文章讲述了如何使用C++编程解决一个关于计算1到n范围内特定数字x出现次数的问题,通过位操作和循环逐个检查每个数的每一位来统计x的出现次数。
摘要由CSDN通过智能技术生成

一、题目

【题目描述】

试计算在区间 1到 n的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在11到1111中,即在 1、2、3、4、5、6、7、8、9、10、111、2、3、4、5、6、7、8、9、10、11 中,数字 11 出现了 44 次。

【输入】

输入共 11 行,包含 22 个整数 n、x之间用一个空格隔开。

【输出】

输出共 11 行,包含一个整数,表示 x 出现的次数。

【输入样例】

11 1

【输出样例】

4

【提示】

【数据说明】

对于 100%的数据,1≤n≤1,000,000,0≤x≤9

二、解析

1、首先我们要从题目中得到关键信息:
  • 要求,找1到n中所有数字包含x的个数
  • 需要输入,n和x,输出个数的总数
2、问题拆分:
  • 我们怎么找一个数中有几个x呢?

        要找一个数有几个x,比如我们要找123311有几个1.我们是不是需要把他的个位,十位,百位,千位…,一直判断到最高位是不是1 呀。

        我们可以使用while循环来一个位数一个位数地找。像下面这样

while(temp!=0){// 首先需要判断这个数是不是0
			if(temp % 10 == x)// 然后找它的个位是不是x
				++ans;// 计数
			temp /= 10;// 对这个数除以10,把它变小,这样下此次求余数的时候就是更高位数的数了
		}
  • 我们是不是可以使用循环将1到n每一个数都按照上面的方法进行找x呢
  • 最后输出总的次数。注意装总次数的盒子需要时long long型,并且要初始化为0哟。

三、代码

 #include<bits/stdc++.h> 
using namespace std;
int main(){
        int n, x;
        long long ans = 0;//变量ans用于装总的次数
	cin >> n >> x;
	for(int i=1; i<=n; i++){
		int tmp = i;//将i临时存储到变量temp里
                //对每个数的位数进行拆分
		while(tmp!=0){//当对这个数每一位都判断完是,这个数就变为了0
			if(tmp % 10 == x)
				++ans;
			tmp /= 10;
		}
	}
	cout << ans;
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值