Atcoder Beginner Contest 336 C - Even Digits

文章讲述了如何解决一个编程问题,给定非负整数N,找到第N个所有数字均为偶数(0,2,4,6,8)的好整数。通过分析,利用位数的组合来确定每个位置应填入的数字,最终实现高效代码求解。
摘要由CSDN通过智能技术生成

【原文】:
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],第八个即为第二行第三个。

02468
2022242628
4042444648
6062646668
8082848688

思路就是这样,接下来就是考虑怎么把我们的思路体现在代码上了。

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值