2013-11-20 3 views
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

Вы должны сказать, что если алгоритм DO, в чтобы дать вам лучшие способы его реализации ... – Daniel

+0

Простой вызов 'std :: transform' должен работать нормально. Конечно, он также не может иметь побочных эффектов, поэтому он может не зависящим от того, как вы определяете 'divsum'. – chris

+1

Если ваше решение превышает время, проблема обычно заключается в сложности алгоритма, а не в используемой памяти. Однако для уменьшения использования памяти вы можете использовать 'std :: vector y (x)'. –

ответ

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 должны быть прочитаны перед выходом? – Nazar554

+1

Я знаю, что это можно сделать так, но программе необходимо сначала ввести все числа, а затем вывести результаты. – user3002211

+0

Хорошо. Позвольте мне отредактировать его, чтобы лучше ответить, соблюдая требование. – theAlias

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, он по-прежнему выделяет больше памяти, чем нужно, и это тратит время на это. – Nazar554

+0

@ Nazar554, что буквально означает не что иное, как изменение того, насколько велика N в инструкции 'sub esp, N'. Он будет иметь * нулевой эффект на время. Тем не менее, он * может * существенно влиять на переполнение стека. – WhozCraig

Смежные вопросы