一、题目
【题目描述】
试计算在区间 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;
}