Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 18
1

Как ускорить работу цикла?

28.11.2015, 07:20. Показов 2893. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Итак, мне нужно было решить задачу на подобии вот этой Найти на отрезке [m, n] натуральное число, имеющее наи¬большее количество делителей на языке PascalABC.И как бы вариант решения подходит , но проблема в том что промежуток чисел от 1 до миллиона .И поэтому комп выполняет программу очень долго. Есть какие то идеи что бы ускорить работу программы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2015, 07:20
Ответы с готовыми решениями:

Объяснить работу цикла
Здравствуйте.Прошу помочь с объяснением цикла в программе!(а именно,что такое а,t1,t2,k?)Заранее...

Объясните работу цикла while
Максимально просто объясните пожалуйста в чем суть while и примеры кодов в которых он омнрвной ...

Проясните работу цикла
Дана программа program n1; var i,j: integer; BEGIN for i:=12 to 15 do j:=i mod 10; ...

Можно ли как нибудь ускорить работу цикла for?
Подскажите пожалуйста - можно ли как нибудь ускорить работу цикла for? Заранее сильно благодарен!

5
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7792 / 4616 / 2829
Регистрация: 22.11.2013
Сообщений: 13,112
Записей в блоге: 1
28.11.2015, 09:11 2
Поменять алгоритм. Можно ускориться за счёт дополнительной памяти примерно так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
const n=1000000;
var
  a: array [1..n] of Word; { стоит проверить с Longint, хватит ли Word }
  i, j: Longint;
begin
  for i:=2 to n do begin { на 1 делятся все }
    j:=i; while j<=n do begin Inc(a[j]); Inc(j,i); end;
  end;
  j:=1; for i:=2 to n do if a[i]>a[j] then i:=j;
  Write(a[j]+1,' делителей у');
  for i:=j to n do if a[i]=a[j] then Write(' ',i); WriteLn;
end.
Добавлено через 4 минуты
PS. Для Turbo Pascal такое решение напрямую не подойдет, такого размера массив объявить не выйдет.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2015, 09:43 3
А зачем здесь массив? И у меня эта программа вообще уходит в глубокий цикл даже при n=10.
Есть вот такой вариант, но при n=100000 работает быстро, а при 1 млн очень долго, а Делфи побыстрее.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var n,i,j,k,max,maxn:longint;
begin
max:=1;
maxn:=1;
for i:=2 to 100000 do
 begin
  k:=2;{1 и само}
  for j:=2 to trunc(sqrt(i)) do{считаем делители до корня из числа и умножаем на 2}
  if i mod j=0 then inc(k,2);
  if frac(sqrt(i))=0 then dec(k);{если число полный квадрат, то минус 1}
  if k>max then
   begin
    max:=k;
    maxn:=i;
   end;
  end;
write(maxn,' ',max);
readln
end.
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 18
28.11.2015, 11:08  [ТС] 4
А можно ли выполнить программу в многопотоке ,если конечно такое можно сделать в паскале,может это поможет?

Добавлено через 30 минут
Решил задачу,5 секунд тоже нормально ,уж получше прошлого алгоритма, спасибо Puporev. Вот код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var n,i,j,k,max,maxn:longint;
time:real;
begin
max:=1;
maxn:=1;
time:=milliseconds;
for i:=2 to 1000000 do
 begin
  k:=2;{1 и само}
  for j:=2 to trunc(sqrt(i)) do{считаем делители до корня из числа и умножаем на 2}
  if i mod j=0 then inc(k,2);
  if frac(sqrt(i))=0 then dec(k);{если число полный квадрат, то минус 1}
  if k>max then
   begin
    max:=k;
    maxn:=i;
   end;
  end;
  time:=(milliseconds-time)/1000;
writeln (maxn,' ',max);
writeln (time);
readln
end.
Но я новичок в паскале поэтому не могли бы вы разъяснить что такое trunc,frac,dec и inc?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2015, 11:13 5
Цитата Сообщение от dinaf2000 Посмотреть сообщение
что такое trunc,frac,dec и inc?
А у Вас в Паскале встроенная справка есть, если уж читать более серьезное лень?

Добавлено через 2 минуты
Вот Вы создали тему в разделе Турбо Паскаль, но сами пишете не в нем. Для чего это? Мозги нам попудрить?
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 18
28.11.2015, 11:51  [ТС] 6
Есть... Да создал , случайно так получилось извините

Добавлено через 29 минут
Еще одним условием задачи оказалось вывести делители этого числа доработал код:
Pascal
1
2
3
4
5
for j:=1 to maxn do
  begin
 if maxn mod j  = 0 then
  writeln (j);
  end;
0
28.11.2015, 11:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2015, 11:51
Помогаю со студенческими работами здесь

Ускорить работу вложенного цикла for() C#
Добрый день. Имеется цикл в котором подбираются коэффициенты к массивам таким образом, чтобы коэф...

Как ускорить работу?
Прога ещё не доработана, сейчас интересует именно графический режим, когда нажимается клавиша 1-4...

Как ускорить работу IJ?
Ребят, всем добрый день, я читал, что ява компилируется дольше, чем си, но у меня как-то долго......

Как ускорить выполнение цикла
Есть ajax запрос по которой передается данные в другой файл и там выполняется цикл от 100 до 1000...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru