【原文】:
C-Even Digits
Time Limit: 2 sec / Memory Limit: 1024 MB
Problem Statement:
A non-negative integer n is called a good integer when it satisfies the following condition:
All digits in the decimal notation of n nn are even numbers (0,2,4,6, and 8).
For example,0,68 6868, and 2024 are good integers.
You are given an integer N NN. Find the N NN-th smallest good integer.
Constraints:
1 ≤ N ≤
1
0
12
10^{12}
1012
N is an integer.
Input
The input is given from Standard Input in the following format:
N
Output
Print the N-th smallest good integer.
【题意】:
N为非负整数,如果n的每一位数都为十进制下的偶数时,我们称它为“好整数”。现在输入一个N,要求输出第N小的好整数。前几个好整数即为0,2,4,6,8,20,22,24……
【题解】
如果用暴力枚举,超时是必然的。每个数位只有0,2,4,6,8五种可能,所以一位数字就有五种,两位数字就有
5
2
5^{2}
52种可能,以此类推。然后我们再把思路放在怎么确定第几位应该对应哪个数。比如我们求第八小的好整数。
1*5<8
2*5>8
这说明,第一位数字如果是0就小了,应为2,然后对于下一位来说,我们应该进行8-5=3的操作。
1*5>3
这说明第二位的数字应该是第三个可能,即为4。故应该为24。为了便于理解,你也可以看成一个数组。
这就是一个二维数组arr[5][5],第八个即为第二行第三个。
0 | 2 | 4 | 6 | 8 |
---|---|---|---|---|
20 | 22 | 24 | 26 | 28 |
40 | 42 | 44 | 46 | 48 |
60 | 62 | 64 | 66 | 68 |
80 | 82 | 84 | 86 | 88 |
思路就是这样,接下来就是考虑怎么把我们的思路体现在代码上了。
code
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, p = 1, count = 0;
cin >> n;
while (p <= n)//判断n位于5的几次方区间内,或者说判断结果应该为几位数
{
p *= 5;
count++;
}
int i, j;
for( i = 1; i <= count; i++)
{
p /= 5;
for ( j = 0; j < 5; j++)//判断为第几个可能
{
if ((j+1) * p >= n)
{
n -= j * p;//考虑下一位
cout << j * 2;
break;
}
}
}
return 0;
}