Сохранение неизвестного количества целых чисел, не занимая слишком много времени / памяти

0
#include <iostream>

using namespace std;

unsigned long long divsum(unsigned long long x);

int main()
{
    unsigned long long x;
    cin >> x;
    unsigned long long y[200000];
    for (unsigned int i = 0; i < x; i++)
        cin >> y[i];
    for (unsigned int i = 0; i < x; i++){
        cout << divsum(y[i]) << endl;
    }
    return 0;
}

unsigned long long divsum(unsigned long long x){
    int sum = 0;
    for(unsigned int i = 1; i <= x/2; i++){
        if(x % i == 0)
            sum += i;
    }
    return sum;
}

Я делаю онлайн-упражнение, и он говорит, что в первой строке есть 2000000 дел, поэтому я сделал массив этой суммы, однако, когда я отправляю решение, оно превышает время. Поэтому мне было интересно, что такое альтернатива и более быстрый способ сделать это? Программа работает отлично сейчас, за исключением того, что она превышает срок действия веб-сайта.

  • 1
    Вы должны сказать, что должен делать алгоритм, чтобы дать вам лучшие способы его реализации ...
  • 0
    Простой вызов std::transform должен работать нормально. Конечно, он также не может иметь побочных эффектов, поэтому он может не зависеть от того, как вы определяете divsum .
Показать ещё 13 комментариев
Теги:
arrays
memory

2 ответа

0

Поскольку вы знаете размер массива, попробуйте vector и reserve.

 int main()
    {
        unsigned long long x;
        cin >> x;
         unsigned long long var;
         vector<unsigned long long> y;
         y.reserve(x);
         for (unsigned int i = 0; i < x; i++){
          cin >> y[i];
         }for (unsigned int i = 0; i < x; i++){
           cout << divsum(var) << endl;
        }
        return 0;
    }

И дело в const &

const unsigned long long & divsum(const unsigned long long & x){
    int sum = 0;
    unsigned long long x2 = x/2
    for(unsigned int i = 1; i <= x2; i++){
        if(x % i == 0)
            sum += i;
    }
    return sum;
}
  • 0
    Что если упражнение ожидает, что весь ввод из stdin должен быть прочитан перед выводом?
  • 1
    Я знаю, что это возможно, но программа требует сначала ввести все цифры, а затем вывести результаты.
Показать ещё 3 комментария
0

Вы можете распределить массив динамически, поэтому он будет работать лучше в тех случаях, когда x < 200000

int main()
{
    unsigned long long x;
    cin >> x;
    unsigned long long *y = new unsigned long long[x];
    // you can check if new didn't throw an exception here
    for (unsigned int i = 0; i < x; i++)
        cin >> y[i];
    for (unsigned int i = 0; i < x; i++){
        cout << divsum(y[i]) << endl;
    }
    delete[] y;
    return 0;
}
  • 0
    Как массив в динамической памяти работает лучше, чем массив в стеке или в глобальной памяти? Все должны иметь одинаковую схему адресации, если динамическая память не выгружена на диск или что-то еще.
  • 0
    @ThomasMatthews Программа выделяла массив из 200000 элементов при каждом запуске. Это означает, что даже если x меньше 200000, он по-прежнему выделяет больше памяти, чем нужно, и тратит на это время.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню