Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2015, 17:44   #31
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Дык это-то понятно.. именно время и интересовало.. Спасибо!
Poma][a вне форума Ответить с цитированием
Старый 20.03.2015, 09:37   #32
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Оптимизировал SumDel вообще летать стало 10^7 чуть больше секунды
Код:
function SumDel(ak: Integer): Integer;
var ti,tk: Integer;
begin
  tk:=Trunc(Sqrt(ak)+0.1);
  if tk*tk>ak then Dec(tk);
  Result:=1;
  for ti:=2 to tk-1 do if ak mod ti=0 then Inc(Result,ti+(ak div ti));
  if ak mod tk=0 then Inc(Result,tk);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2015, 10:01   #33
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Оптимизировал SumDel вообще летать стало 10^7 чуть больше секунды
Код:
function SumDel(ak: Integer): Integer;
....
Красотища! Примите мой респект!!
грущу, что не смог до этого дойти своим умом..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2015, 16:43   #34
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ночевать пришлось вместе без интернета - вспомнил эту задачу..
А что если разложить число на множители :
900 = 2*2*3*3*5*5 (их не больше log2(n))
Прекрасно. Теперь делаем такую красоту :
бежим по этим множителям, ища их произведение :

Получаем алгоритм, который на k-ом шаге берет произведение k первых множителей. А дальше у нас будет массив простых чисел (их 664579 (до 10^7)) и там бинарным поиском ищем число больше нашего и меньше нашего (но ближайщие к полученному). А дальше эти два умножаем на оставшиеся. Получаем (log2(n))^2 * (18)
Летать будет, не?

Правда нужно сохранить эти 664579 числа.. А это 4 байта на брата итого 2мб.. сойдет, не?
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить произведение чисел, неравных заданному числу Z Hug Помощь студентам 4 12.11.2013 23:27
найти кол-во трехзначных чисел сумма простых делителей которых кратна 5 (на Делфи) anzorchik Помощь студентам 2 02.10.2011 16:18
Определить ближайший элемент массива к заданному числу wowan Паскаль, Turbo Pascal, PascalABC.NET 1 28.05.2011 23:21