一、题目链接:C - Even Digits (atcoder.jp)
二、解法说明:
本题要求输出第n项good integer。
我们首先要理解什么是good integer,good integer就是指各位数字都是偶数的数。
比如:0,2,4,6,8,20......
我们可能首先想到直接把所有的good integer求出来,找到第n项不久好了。
但由于本人自己的原因,写出来的代码总是有几个测试点不过,看了一下应该是当数字过大了之后就会运行错误。然后在我看了别人的代码之后,我明白了一个比较好的解题方法,这种方法比直接找要快很多。
首先呢,我们知道,如果每位数都是偶数,那么只能是0、2、4、6、8这5个数,也就是说完美数就是这5个数字的组合。假设这个数字有x位数,因为每位数都有5种可能,那么这个数的可能就会有 种。我们要找第n项是什么,就可以转化为先求第n项是几位数。
比如第八位,
由于 < 8 、 > 8
那么第八项就是一个两位数,最高位是2.
对于后面的位数都是什么,我们可以这样想,由于是从小向大排序,所以我们将最高位代表的项减掉,剩下的就是另一个新good integer,同样的思路进行解决就可以了。
三、题解:
#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;
}