Как сделать этот алгоритм кода эффективным? Каким будет код после использования этого алгоритма? Как я могу избежать превышения лимита времени для этой программы? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть эта проблема:

Некоторые положительные целые числа могут быть представлены суммой одного или нескольких последовательных простых чисел. Сколько таких представлений имеет данное положительное целое число?

Например, целое число 53 имеет два представления 5 + 7 + 11 + 13 + 17 и 53. Целое число 41 имеет три представления 2 + 3 + 5 + 7 + 11 + 13, 11 + 13 + 17 и 41 Целое число 3 имеет только одно представление, которое равно 3. Целое число 20 не имеет такие представления.

Обратите внимание, что слагаемые должны быть последовательными простыми числами, поэтому ни 7 + 13, ни 3 + 5 + 5 + 7 не являются допустимым представлением для целого числа 20.

Миссия состоит в том, чтобы написать программу, которая сообщает количество представлений для данного положительного целого числа.

Пример ввода:

2
3
17
41
20
666
12
53
0

Пример вывода:

1
1
2
3
0
0
1
2

Я использовал метод seive, чтобы получить массив простых чисел, p [10011]. Мой код:

#include <stdio.h>
int main()
{
    int n, i, j, k, l, sum, count, ara[10011], d[10011];
    while (-1) 
    {
        for (i = 2; i <= n; i++)
        {
            ara[i] = 0;
        }
        l = 0;
        while (1)
        {
            k = 0;
            scanf("%d", &n);
            int p[n];
            count = 0;
            for (i = 2; i <= n; i++)
            {
                if (ara[i] == 0) 
                {

                    for (j = 2 * i; j <= n; j += i) 
                    {
                        ara[j] = 1;
                    }
                }
            }
            for (i = 2; i <= n; i++)
            {

                if (ara[i] == 0)
                {

                    p[k++] = i;
                }
            }
            for (i = 2; i <= n; i++) 
            {

                if (ara[i] == 0) 
                {

                    p[k++] = i;
                }
            }
            for (i = 0; i < k; i++) 
            {
                sum = 0;
                for (j = i; j < k; j++) 
                {
                    sum += p[j];
                    if (sum == n) 
                    {
                        count++;
                        break;
                    }
                }
            }
            d[l] = count;
            if (n == 0)
                break;
            l++;
        }
           for (i = 0; i < l; i++) 
           {
            printf("%d\n", d[i] / 2);
           }
    }
    return 0;
}

1 Ответ

0 голосов
/ 28 марта 2019

Ваш код истекает, потому что вы продолжаете пересчитывать то, что уже знаете:

  1. Вы пересчитываете все простые числа для каждого запроса (вы можете предварительно рассчитать все необходимые простые числа до начала запросов)

  2. Вы пересчитываете вещи, которые вы уже знаете. (т.е. если есть запрос, который просит подсчитать представления для некоторого целого числа х, и затем позже другой запрос также спрашивает, действительно ли вам нужно снова вычислить ответ?)

Предложения:

  1. Есть только 10000 возможных запросов, поэтому просто создайте массив ответьте [10001] и заполните все возможные ответы.

  2. 10000 не так много, так что вы даже можете сохранить все ответы в файле и закодировать его как массив в коде, чтобы на все запросы отвечали O (1) за запрос

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