如何生成仅由偶数数字组成的第n个数字? [英] How to generate the nth number that consists only of even digits?

查看:40
本文介绍了如何生成仅由偶数数字组成的第n个数字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是编程新手.我可以找到由偶数组成的数字,但是我的算法复杂度是O(n).对于大的 n ,我的算法太慢了.所以我需要一个更高效的算法.谁能帮我?

I'm novice to Programming. I can find numbers consisting of even digits but my algorithm complexity is O(n). For large n my algorithm is too slow. So I need a more efficient algorithm. Can anyone help me?

例如,具有偶数位的前数字是0,2,4,6,8,20,22,24,26,28,40等.2686是具有偶数位的数字的另一个示例.

For example, the first numbers with even digits are 0 , 2 , 4 , 6 , 8 , 20 , 22 , 24 , 26 , 28 , 40 etc. 2686 is another example of a number with even digits.

这是我的代码: http://ideone.com/nsBzej

#include<bits/stdc++.h>
using namespace std;
long long int a[10],b[20];
long long int powr(int i)
{
    long long int ans=5;
    for(int j=2;j<=i;j++)
    {
        ans=ans*5;
    }
    return ans;
}
int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);

    long long int n,s,sum,p;
    int t;
    cin>>t;
    for(int j=1;j<=t;j++)
    {
        s=20,sum=0;
        a[1]=0, a[2]=2, a[3]=4, a[4]=6, a[5]=8;

        for(int i=1;i<=17;i++)
        {
            b[i]=s;
            s=s*10;
        }

        cin>>n;
        for(int i=17;i>=1;i--)
        {
            p=powr(i);
            while(p<n)
            {
                sum=sum+b[i];
                n=n-p;
            }
        }

        printf("Case %d: %lld\n",j,sum);
    }
}

是复杂度O(n).但是我得到了错误的判决.

It is complexity O(n). But I get wrong verdict.

推荐答案

#include <stdio.h>

int main(void){
    unsigned long long nth = 1000000000000ULL-1;//-1: 1 origin
    unsigned long long k[30] = {0, 5};//28:Log10(ULL_MAX)/Log10(5) + 1
    unsigned long long sum = k[1];
    unsigned long long temp = 4;//4 : 2,4,6,8
    int i;
    //make table
    for(i = 1; i < 30 ; ++i){
        if(k[i] == 0){
            temp *= 5;//5 : 0,2,4,6,8 , 2digits: 4*5, 3digits: 4*5*5
            sum += temp;
            k[i] = sum;
        }
        if(k[i] > nth)
            break;
    }
    while(--i){//The same basically barakmanos
        int n = nth / k[i];
        printf("%d", n * 2);
        nth -= n * k[i];
    }
    printf("%d\n", nth * 2);
    return 0;
}

这篇关于如何生成仅由偶数数字组成的第n个数字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆