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

Уменьшить время выполнения программы

19.01.2017, 08:52. Показов 1286. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть программа
Pascal
1
2
3
4
5
6
7
var n,i:integer;
begin
read(n);
for i:=1 to n do 
if n mod i = 0 then 
write(i,' ');
end.
выполняется за 1.091 секунды ,как уменьшить время до 1 секунды?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2017, 08:52
Ответы с готовыми решениями:

Уменьшить время выполнения программы
Здравствуйте, мне дана задача, на решение которой дан лимит по времени: 400ms. В моем решении на...

Определить время выполнения программы
uses crt; var a:array of integer; i,k,n:integer; begin writeln('n='); readln(n); for i:=1...

Как закрыть граф. модуль во время выполнения программы
Как закрыть граф. модуль во время выполнения программы? Я написал большой код, но забыл...

Уменьшить время работы компилятора
var a, a2: string; i, k: integer; begin read(a); for i := 1 to length(a) do ...

14
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 10:31 2
Сделать-то что надо? Вывести делители числа включая 1 и само число в произвольном порядке?
Pascal
1
2
3
4
5
6
var n, i: Integer;
begin
  Read(n);
  for i:=1 to Trunc(Sqrt(n))-1 do if n mod i = 0 then Write(' ',i,' ',n div i);
  i:=Trunc(Sqrt(n)); if Sqr(i)=n then Write(' ',i);
end.
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 10:42  [ТС] 3
Нужно сделать так ,чтобы показывались все числа которые могут разделить данное без остатка ,не включая 1 и само число
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 11:07 4
Если по возрастанию, то
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var q, n: Integer;
procedure p(t: Integer);
begin
  while (t<q) and (n mod t<>0) do Inc(t);
  if n mod t=0 then begin
    Write(' ',t);
    if t<q then p(t+1);
    if (Sqr(t)<>n) then Write(' ',n div t);
  end;
end;
begin
  Read(n); q:=Trunc(SqRt(n)); p(1);
end.
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 11:48  [ТС] 5
И опять не подходит
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 11:55 6
Цитата Сообщение от Damik24 Посмотреть сообщение
не включая 1 и само число
Но у вас-то не так, и 1, и n включены:
Цитата Сообщение от Damik24 Посмотреть сообщение
Pascal
4
for i:=1 to n do
Соответственно, модификации минимальны:
без учета порядка:
Pascal
1
2
3
4
5
6
var n, i: Integer;
begin
  Read(n);
  for i:=2 to Trunc(Sqrt(n))-1 do if n mod i = 0 then Write(' ',i,' ',n div i);
  i:=Trunc(Sqrt(n)); if Sqr(i)=n then Write(' ',i);
end.
С учетом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var q, n: Integer;
procedure p(t: Integer);
begin
  while (t<q) and (n mod t<>0) do Inc(t);
  if n mod t=0 then begin
    Write(' ',t);
    if t<q then p(t+1);
    if (Sqr(t)<>n) then Write(' ',n div t);
  end;
end;
begin
  Read(n); q:=Trunc(SqRt(n)); p(2);
end.
Добавлено через 2 минуты
Цитата Сообщение от Damik24 Посмотреть сообщение
не подходит
Не подходит 1-й вариант? Не подходит 2-й вариант?
Не подходит по решению? Не подходит по времени?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 12:25  [ТС] 7
Пишет частичное решение ,а по времени всё нормально
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 12:28 8
Проверяющая система на чем? FreePascal? Замените Integer на Longint (достаточно только для n) -- что-то изменится?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 13:13  [ТС] 9
Компилятор: PascalABC 2.10.8.1
Вердикт: Неверный ответ
Статус: Частичное решение
Найти все простые делители натурального числа N.
Входные данные: Ввести одно число N (1<=N<=200000000).
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 13:46 10
Цитата Сообщение от Damik24 Посмотреть сообщение
все простые делители
Вы не знаете, что такое простое число?
Каждый из простых делителей должен быть указан один раз или как в разложении?
Правильный вывод для числа 8 должен быть 2 или 2 2 2 ?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 14:01  [ТС] 11
Пример : при вводе числа 10 ,выводится число 2 и 5
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 14:08 12
Damik24,
это не ответ на вопрос "при вводе числа 8 выводится 2 или 2 2 2?"
При вводе числа 20 выводится 2 и 5 или 2 2 и 5?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 7
19.01.2017, 14:09  [ТС] 13
При вводе числа 20 должно выводиться 2 4 5 10
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
19.01.2017, 14:23 14
Цитата Сообщение от Damik24 Посмотреть сообщение
при вводе числа 20 должно выводиться 2 4 5 10
И конечно числа 4 и 10 по просьбе каждого дебила становятся простыми..
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
19.01.2017, 15:23 15
В первом приближении:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function IsPrime(n: Longint): Boolean;
var i, q, d: Word;
begin
  if (n>=5) and ((n-1) mod 6=0) or ((n+1) mod 6=0) then begin
    i:=5; d:=2; q:=Trunc(SqRt(n));
    IsPrime:=False;
    while i<=q do begin
      if n mod i=0 then Exit;
      Inc(i,d); d:=d xor 6;
    end;
    IsPrime:=True;
  end else
    IsPrime:=(n=2) or (n=3);
end;
var q: Integer; n: Longint;
procedure p(t: Integer);
begin
  while (t<q) and (n mod t<>0) do Inc(t);
  if n mod t=0 then begin
    if IsPrime(t) then Write(' ',t);
    if t<q then p(t+1+Ord(Odd(t)));
    t:=n div t;
    if (Sqr(Longint(t))<>n) and IsPrime(t) then Write(' ',t);
  end;
end;
begin
  Read(n); q:=Trunc(SqRt(n)); p(2);
  if IsPrime(n) then Write(' ',n);
end.
Добавлено через 6 минут
Если не хватит времени на вычисления, можно обратить внимание на то, что проверка на простые производится по возрастанию, поэтому с целью оптимизации можно организовать запоминание ранее вычисленных простых, довычисляя следующие при необходимости.

Добавлено через 15 минут
Для проверки быстродействия предлагаю пару плохих случаев (квадратов простых чисел возле верхней границы 2*10^8):
194072761 = 13931^2
205664281 = 14341^2
0
19.01.2017, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2017, 15:23
Помогаю со студенческими работами здесь

Как получить время выполнения программы?
подскажите, пожалуйста, как засечь время выполнения программы. нигде найти не могу=( пишут, что это...

Как уменьшить время работы программы?
const nmax=10000; var a:array of integer; n,m,i,j,x:integer; f:boolean; begin...

Уменьшить время работы программы по поиску совершенных чисел
нужно найти в диапазоне совершенные числа. я это сделал, но у меня возникла проблема. при проверке...

Определить время выполнения программы
Как в рабочую программу вставить подсчёт время её выполнения? мне нужно ., чтобы программа вконце...


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

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