Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于计算不包含给定数字的第n个数字的程序 我被要求编写一个C++程序,计算不包含给定数字的n个数,并且时间执行低于0.1秒。内存似乎不是问题,因为我可以使用高达64MB的内存_C++_Algorithm - Fatal编程技术网

用于计算不包含给定数字的第n个数字的程序 我被要求编写一个C++程序,计算不包含给定数字的n个数,并且时间执行低于0.1秒。内存似乎不是问题,因为我可以使用高达64MB的内存

用于计算不包含给定数字的第n个数字的程序 我被要求编写一个C++程序,计算不包含给定数字的n个数,并且时间执行低于0.1秒。内存似乎不是问题,因为我可以使用高达64MB的内存,c++,algorithm,C++,Algorithm,问题的原始文本如下所示: 为了表示数字,决定不使用数字C 再一次 因此,从自然数数组中,所有包含 数字C将被删除。让新数组为S 要求 1确定S中的第N个数字 2 Y和Z是两个自然值 所有自然数数组中的数字。确定 从Y到Z的自然数 输入数据 输入文件cifra4.in包含表示 需求类型。如果T==1,第二行将包含 数字C和数字N。如果T==2,则 第二行将包含数字C和两个自然数Yand Z 输出数据 在输出文件中,cifra4.out将包含在第一行中 根据需求类型,一个自然数 限制和澄清 例1 c

问题的原始文本如下所示:

为了表示数字,决定不使用数字C 再一次 因此,从自然数数组中,所有包含 数字C将被删除。让新数组为S

要求

1确定S中的第N个数字

2 Y和Z是两个自然值 所有自然数数组中的数字。确定 从Y到Z的自然数

输入数据

输入文件cifra4.in包含表示 需求类型。如果T==1,第二行将包含 数字C和数字N。如果T==2,则 第二行将包含数字C和两个自然数Yand Z

输出数据

在输出文件中,cifra4.out将包含在第一行中 根据需求类型,一个自然数

限制和澄清

例1

cifra4.in

cifra4.out

例2

cifra4.in

cifra4.out

十,

我最好的尝试是一个代码,它确定或至少应该是不包含数字0的第n个数字,但对于10^13,它返回23210987654321,它显然包含0

我的慢,但正确的方法是我最终保持。代码如下:

#include <fstream>

std::ifstream in("cifra4.in");
std::ofstream out("cifra4.out");

const long long pow_of_10[14] = {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
                                 10000000000, 100000000000, 1000000000000};

void req_1 ()
{
    short digit;
    long long n;
    in >> digit >> n;
    for (long long i = 0; i <= n; i++)
    {
        long long nr = i;
        if (nr)
        {
            long k = 1;
            do
            {
                if (nr % 10 == digit)
                {
                    n += pow_of_10[k];
                    i += pow_of_10[k] - 1;
                    break;
                }
                nr /= 10;
                k++;
            }
            while (nr);
        }
        else if (digit == 0) n++;
    }
    out << n - 1;
}

void req_2()
{
    short digit;
    long long lhs, rhs;
    long long elim = 0;
    in >> digit >> lhs >> rhs;
    for (long long i = lhs; i <= rhs; i++)
    {
        long long nr = i;
        while (nr)
        {
            if (nr % 10 == digit)
            {
                elim++;
                break;
            }
            nr /= 10;
        }
    }
    out << elim;
}

int main()
{
    short requirement;
    in >> requirement;
    if (requirement == 1)
        req_1();
    else
        req_2();
}


我不是在要求必要的代码,而是想法,可能的算法,可以在适当的时间内执行10^13,最好是问题要求的时间,但1秒对我来说很好。

因为数字的小数位数彼此独立,在该设置中,一个数字不会影响任何其他数字-一旦您固定了至少一个有效数字的前缀,留下n个较低有效数字,您就知道您正好有10-1^n'=9^n'个数字具有该前缀,并且在未固定部分中没有禁止的数字。例如,对于以1开头的3位数字,实际上有81个数字中没有0


这里唯一的“障碍”是将最高有效位设置为零意味着对于不同数字012、0012等可以得到相同的数字。。但是你也应该能够解决这个问题——通过确定没有禁止数字的第n个数字需要多少数字。与我上面描述的论点非常相似。如果您的禁止数字为0或10-2=8,则您知道您有10-1=9选项。

由于一个数字的十进制数字彼此独立,因此设置一个数字不会影响任何其他数字-一旦您固定了至少一个有效数字的前缀,留下n个无效数字,你知道你有10-1^n'=9^n'个带前缀的数字,在不固定部分没有禁止的数字。例如,对于以1开头的3位数字,实际上有81个数字中没有0

这里唯一的“障碍”是将最高有效位设置为零意味着对于不同数字012、0012等可以得到相同的数字。。但是你也应该能够解决这个问题——通过确定没有禁止数字的第n个数字需要多少数字。与我上面描述的论点非常相似。如果您的禁止数字为0或10-2=8,则您知道您有10-1=9选项。

想象9是禁止数字。在这种情况下,您只需将数字转换为基数9即可

现在,如果禁用数字不同,比如d,会发生什么?它仍然是一个以9为基数的数字,但您必须映射您的数字,这样d以下的数字不受影响,d及以上的数字映射到数字d+1

例如,当禁止数字为7,n为125时

步骤1:转换为base-9:12510=1489 步骤2:映射数字。1.→ 1, 4 → 4, 8 → 9 答案是149。

想象9是禁止的数字。在这种情况下,您只需将数字转换为基数9即可

现在,如果禁用数字不同,比如d,会发生什么?它仍然是一个以9为基数的数字,但您必须映射您的数字,这样d以下的数字不受影响,d及以上的数字映射到数字d+1

例如,当禁止数字为7,n为125时

步骤1:转换为base-9:12510=1489 步骤2:映射数字。1.→ 1, 4 → 4, 8 → 9
解决方案是149。

你必须让你的问题更加集中,才能得到有意义的答案。@einpoklum我认为提及你不喜欢的内容对新手来说比不喜欢帖子和渲染更有帮助
打电话,基本上,无论新来者是否编辑,答案都不清晰。公平地说,也许我不够清楚。尝试阅读StackOverflow的页面。我不喜欢的是,一般来说,与此相反…@einpoklum好吧,我包括了我所有的信息,我的语法还不错,标题很能代表我的问题。或者告诉我更多你认为不适合提问的细节。你必须让你的问题更加集中,才能得到有意义的答案。@einpoklum我认为提及你不喜欢的内容对新来者来说比不喜欢这篇文章并使其基本上无法读解更有帮助,不管新来者是否再编辑它。公平地说,也许我不够清楚。尝试阅读StackOverflow的页面。我不喜欢的是,一般来说,与此相反…@einpoklum好吧,我包括了我所有的信息,我的语法还不错,标题很能代表我的问题。或者给我一些你认为不适合提问的细节。
1
0 11
12
2
1 3 20
#include <fstream>

std::ifstream in("cifra4.in");
std::ofstream out("cifra4.out");

const long long pow_of_10[14] = {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
                                 10000000000, 100000000000, 1000000000000};

void req_1 ()
{
    short digit;
    long long n;
    in >> digit >> n;
    for (long long i = 0; i <= n; i++)
    {
        long long nr = i;
        if (nr)
        {
            long k = 1;
            do
            {
                if (nr % 10 == digit)
                {
                    n += pow_of_10[k];
                    i += pow_of_10[k] - 1;
                    break;
                }
                nr /= 10;
                k++;
            }
            while (nr);
        }
        else if (digit == 0) n++;
    }
    out << n - 1;
}

void req_2()
{
    short digit;
    long long lhs, rhs;
    long long elim = 0;
    in >> digit >> lhs >> rhs;
    for (long long i = lhs; i <= rhs; i++)
    {
        long long nr = i;
        while (nr)
        {
            if (nr % 10 == digit)
            {
                elim++;
                break;
            }
            nr /= 10;
        }
    }
    out << elim;
}

int main()
{
    short requirement;
    in >> requirement;
    if (requirement == 1)
        req_1();
    else
        req_2();
}