题目:计算1至n中数字x出现的次数
直接炒栗子!
如果x=[1,9]
2059 5
个位:205个10,
205
∗
1
+
1
205*1+1
205∗1+1:[1,2050)+[2050, 2059] 个位9>5
十位:20个100,
20
∗
10
+
(
9
+
1
)
20*10+(9+1)
20∗10+(9+1):[1,2000)+[2000,2059] 十位5=5
百位:2个1000,
2
∗
100
2*100
2∗100:[1,2000)+[2000, 2059] 百位0<5
千位:0个10000,
0
0
0:[10000,2059] 千位2<5
如果x=0
2059 0
个位:205个10,
(
205
−
1
)
∗
1
+
1
(205-1)*1+1
(205−1)∗1+1:[1,2050)+[2050, 2059] 个位9>0
十位:20个100,
(
20
−
1
)
∗
10
+
10
(20-1)*10+10
(20−1)∗10+10:[1,2000)+[2000,2059]
百位:2个1000,
(
2
−
1
)
∗
100
+
(
59
+
1
)
(2-1)*100+(59+1)
(2−1)∗100+(59+1):[1,2000)+[2000, 2059] 百位0=0
千位:不考虑
为什么"-1",拿个位举例。[1,2050)从[1,10]到[2041,2050),一共有205个长度为10的区间,但是最后一个区间不包括2050啊,不包括0~
窝好菜……想了好久哦……0的愣就是想不明白???www
#include <iostream>
#include <cstdio>
using namespace std;
int Count(int n, int x)
{
int ans = 0;
int tmp = n;
int base = 1;
if(x == 0)
{
while(tmp >= 10)
{
if(tmp % 10 == x)
ans += (tmp / 10 - 1) * base + n % base + 1;
else
ans += (tmp / 10 - 1) * base + base;
base *= 10;
tmp /= 10;
}
return ans;
}
while(tmp)
{
if(tmp % 10 < x)
ans += tmp / 10 * base;
else if(tmp % 10 == x)
ans += tmp / 10 * base + n % base + 1;
else if(tmp % 10 > x)
ans += tmp / 10 * base + base;
base *= 10;
tmp /= 10;
}
return ans;
}
int main()
{
int n, x;
while(cin >> n >> x)
cout << Count(n, x) << endl;
return 0;
}