Прекращено из-за тайм-аута в Хакерранке (используя mallo c in cpp) - PullRequest
1 голос
/ 28 апреля 2020

так что я довольно новый программист, и я только начал задавать вопросы по Hackerrank. Я попробовал вопрос, и он компилируется и работает в автономном режиме ide. Но показывает ошибку на хакерранке. Быстрый ответ мне действительно помог бы.

enter image description here

Это виртуальное представление спирали простых чисел (для целей понимания)

Теперь задача Простые числа записываются в виде спирали, начиная с начала координат (0, 0) и перемещаясь, как показано на рисунке выше. Числа, показанные в правом столбце и нижней строке, являются номерами столбцов и номерами строк соответственно (т.е. координаты y и x)

Цель состоит в том, чтобы найти положение (координаты x и y) данного простого числа .

ОШИБКА Когда я запускаю код в hackerrank, работают 2 из 3 тестовых случаев. Но для одного тестового примера это показывает, что ошибка прервана из-за тайм-аута. Код, который я написал, выглядит следующим образом:

    #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);

    }
}

1 Ответ

1 голос
/ 28 апреля 2020

Ваша проблема в том, что l oop:

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

В конечном итоге вы выполните порядка n ^ 2 итераций вашего внутреннего l oop, где n = 12000000, так что это 144 * 10 ^ 12 итераций вашего внутреннего l oop.

Предположим, что каждая итерация занимает 1 наносекунду (на самом деле она будет намного длиннее), то есть 144 * 10 ^ 12/10 ^ 9 = 144000 секунд или ~ 1,7 дня, чтобы завершить звонок на prime, если вы не наберете if (a == i).

Так что, если ваш тестовый случай вызовет prime с большим a, превышающим вероятно выделенный бюджет времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...