C++ 如何生成仅由偶数组成的第n个数字?

C++ 如何生成仅由偶数组成的第n个数字?,c++,c++11,math,mathematical-optimization,C++,C++11,Math,Mathematical Optimization,我是编程新手。我可以找到由偶数组成的数字,但我的算法复杂度是O(n)。对于大的n我的算法太慢了。所以我需要一个更有效的算法。有人能帮我吗 例如,第一个偶数数字是0、2、4、6、8、20、22、24、26、28、40等。2686是偶数数字的另一个示例 这是我的密码: #包括 使用名称空间std; 长整型a[10],b[20]; 长整数功率(整数i) { 长整型ans=5; 对于(int j=2;j>t; 对于(int j=1;jn; 对于(int i=17;i>=1;i--) { p=功率(i);

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

例如,第一个偶数数字是0、2、4、6、8、20、22、24、26、28、40等。2686是偶数数字的另一个示例

这是我的密码:

#包括
使用名称空间std;
长整型a[10],b[20];
长整数功率(整数i)
{
长整型ans=5;
对于(int j=2;j>t;
对于(int j=1;jn;
对于(int i=17;i>=1;i--)
{
p=功率(i);
而(p
#包括
内部主(空){
无符号长N=10000000000Full-1;//-1:1原点
无符号长k[30]={0,5};//28:Log10(ULL_MAX)/Log10(5)+1
无符号长和=k[1];
无符号long-long-temp=4;//4:2,4,6,8
int i;
//摆桌子
对于(i=1;i<30;++i){
如果(k[i]==0){
temp*=5;//5:0,2,4,6,8,2数字:4*5,3数字:4*5*5
总和+=温度;
k[i]=总和;
}
if(k[i]>n次)
打破
}
而(--i){//基本相同
int n=n次/k[i];
printf(“%d”,n*2);
n-=n*k[i];
}
printf(“%d\n”,n*2);
返回0;
}

你对“偶数”的定义是什么?为什么10不是“偶数”?你能告诉我们你试过什么吗?我想他的意思是他只想找到所有数字都是偶数的数字:10有一个奇数。@Wallkan:闻起来像是一个家庭作业,答案是224682000000000。算法很简单:以5为基数计算10000000000,然后用
2d
替换每个数字
d
。尽管非常简单写得不好,这是一个有趣的问题,应该在IMO中重新打开。如果您运行多个数字,表将提前创建。谢谢@BLUEPIXY。我知道了。
#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);
    }
}
#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;
}