C题:Even Digits
标签:思维、数学
题意:给出定义十进制数
x
x
x的所有数位都是偶数(即
0
、
2
、
4
、
6
、
8
0、2、4、6、8
0、2、4、6、8)的时候称为 “好整数”,给定一个
n
n
n,求第
n
n
n小的 “好整数”。(
1
<
=
n
<
=
1
0
12
1<=n<=10^{12}
1<=n<=1012)
前几个 “好整数” 分别为
0
、
2
、
4
、
6
、
8
、
20
、
22
、
24
、
26
、
28...
0、2、4、6、8、20、22、24、26、28...
0、2、4、6、8、20、22、24、26、28...
题解:每个数位都是最多
5
5
5种可能,我们可以先求出超过
n
n
n需要的位数,比如第
8
8
8小的,一位最多只有
5
5
5种,两位能到
25
25
25种,所以至少得两位。
接着我们再求目前当前这位对应的到底是
0
、
2
、
4
、
6
、
8
0、2、4、6、8
0、2、4、6、8中的哪一个。
比如第
8
8
8小的,我们求第一位上的数字的时候,
1
∗
5
<
8
1*5<8
1∗5<8
2
∗
5
>
8
2*5>8
2∗5>8
所以我们能确定,第一位上的数字是
2
2
2。对于后面的第二位来说,我们需要把刚刚第一位带来的整个部分的个数给减掉,
8
−
5
=
3
8-5=3
8−5=3。
1
∗
1
<
3
1*1<3
1∗1<3
1
∗
2
<
3
1*2<3
1∗2<3
1
∗
3
>
=
3
1*3>=3
1∗3>=3
所以第二位上的数字是
4
4
4。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n, k = 1, c = 0;
cin >> n;
while (k <= n) {
k *= 5;
c++;
}
for (int i = 1; i <= c; i++) {
k /= 5;
for (int j = 1; j <= 5; j++) {
if (j * k >= n) {
n -= (j-1) * k;
cout << (j - 1) * 2;
break;
}
}
}
return 0;
}