c++ - 由于Hackerrank中的超时而终止(在cpp中使用malloc)

标签 c++ performance memory-efficient

所以我是一个非常新的程序员,我刚刚开始对Hackerrank进行提问。我尝试了一个问题,它可以在离线ide上进行编译和工作。但是在hackerrank上显示错误。迅速的回答将对我有帮助。

这是质数螺旋的虚拟表示(出于理解目的)

现在是问题
如上图所示,素数以螺旋形式从原点(0,0)开始并移动。右列和底行中显示的数字分别是列号和行号(即y和x坐标)

目的是找到给定素数的位置(x和y坐标)。

错误
当我在hackerrank中运行代码时,有3个测试用例中有2个起作用。但是对于一个测试用例,它显示由于超时而终止了错误。
我编写的代码如下:

    #include<iostream>
using namespace std;
int prime(int a)
{
    int count, h=0;
    for (int i = 2; i <= 12000000; i++)
    {
        count = 0;
        for (int j = 2; j <= i; j++)
        {
            if(i%j==0)
            {
                count++;
            }
        }
        if (count == 1)
        {
            h = h + 1;
        }
        if (a == i)
        {
            break;
        }
    }
    return h;

}
void spiral(int h)
{
    int stepnum=1, totalsteps = 2;
    int x_coordinate = 0, y_coordinate = 0;
    int operatn = 1;
    for(int i=2;i<=h;i++)
    {
        if (stepnum <= (totalsteps/2))
        {
            x_coordinate = x_coordinate + operatn;
        }
        else
        {
            if (stepnum <= totalsteps)
            {
                y_coordinate = y_coordinate + operatn;
            }
        }
        if (stepnum == totalsteps)
        {
            stepnum = 0;

            operatn = -1 * operatn;

            totalsteps = totalsteps + 2;


        }
        stepnum++;

        }

    cout << "x coordinate = "<<x_coordinate<< " y coordinate = "<<y_coordinate<<endl;

}

int main()
{
    int t;
    int* p;
    cout<<"Enter the number of cases :"<< endl;
    cin >> t;
    int test;
    p=(int*)malloc(t*4);
    for (int i = 0; i < t; i++)
    {
        cin >> *(p+i);
    }
    for (int i = 0; i < t; i++)
    {
        test = prime(*(p + i));
        spiral(test);

    }
}

最佳答案

您的问题是这个循环:

for (int i = 2; i <= 12000000; i++)
...
    for (int j = 2; j <= i; j++)
    ...

您最终将按照内部循环的n ^ 2次迭代的顺序执行操作,其中n = 12000000,因此,这是内部循环的144 * 10 ^ 12次迭代。

假设每次迭代都需要1纳秒的时间(实际上会更长),所以对prime的调用需要144 * 10 ^ 12/10 ^ 9 = 144000秒或约1.7天,除非您中断if (a == i)

因此,如果您的测试用例碰巧以较大的prime调用a,则可能会超过分配的时间预算。

关于c++ - 由于Hackerrank中的超时而终止(在cpp中使用malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61468900/

相关文章:

c++ - 如何通过zeromq发送包含\0的序列化跳跃运动帧?

java final 变量和性能

javascript - 有没有一种运行时更有效的方法来迭代这个数组? (JavaScript)

php - 动态加载选择数百万选项 php mysql

javascript - 为什么 RegExp.test 在 IE 中消耗大量时间?

c++ - 派生类可以小于其父类吗?

java - 如何在Java中解析包含多个工作表、内存在50MB以内的xls文件

c++ - 如何使用 float 组中的数据初始化 cv::Mat

c++ - 带有复制构造函数的多态性

C++ regex 将正则表达式转换为 C++ 代码