ATCODERS ABC 336 C

一、题目链接: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种可能,那么这个数的可能就会有^{} 5^{x} 种。我们要找第n项是什么,就可以转化为先求第n项是几位数。

比如第八位,

由于  5^{1}  <  8    、  5^{2}  >  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;
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值