С Новым годом! Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 04.01.2012
Сообщений: 56

Отладка программы по поиску совершенных чисел

05.08.2012, 00:24. Показов 8579. Ответов 28

Студворк — интернет-сервис помощи студентам
Задание найти 4-е совершенное число(число сумма делителей которого равно самому числу)
Вот написал код, все работает, но интересует есть ли способ отладить программу так чтобы он это делала быстрее? у меня время получается около 9 секунд)

и как можно реализовать поиск последующих чисел? возможно ли это на обычном компе?))
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var n,m,i,:integer;
begin
     For n:=1 to 9999 do begin
     m:=0; i:=1;
          while i<n do begin
               If n mod i = 0 then
                  m:=m+i;
                  inc(i);
            end;
          If n=m then writeln(n)
     end;
     readln
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2012, 00:24
Ответы с готовыми решениями:

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

Можно ли увеличить быстродействие программы по поиску простых чисел?
Я составил для себя программу, ищущую простые числа. Мне удалось довести её до следующей скорости: На Ubuntu 12.04 числа в пределах...

Реализовать поиск совершенных чисел для больших чисел (Big Integer)
Всем привет! Задача заключается в поиске совершенных чисел. И тут возникла потребность в использовании типов данных превышающих размеры...

28
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 08:59
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var n,m,i:integer;
begin
     n:=0;
     While n<9999 do
      Begin
          inc(n,2);m:=0;i:=1;
          while i<=n div 2 do begin
               If n mod i = 0 then
                  inc(m,i);
                  inc(i);
            end;
          If n=m then writeln(n)
      end;
     readln
end.
У меня секунды даже не проходит все выводит)...Здесь я использовал знания о совершенных числах то что все они четные (по крайней мере не четных не нашли ещё) да и делитель числа не может быть больше чем n div 2 да и нам и не надо учитывать само число как делитель).И лучше использовать вместо операции сложения inc в книге читал что она быстрее работает чем сложение

Добавлено через 7 минут
Цитата Сообщение от Dan_Shady Посмотреть сообщение
и как можно реализовать поиск последующих чисел? возможно ли это на обычном компе?))
Хм мне когда задали найти 5-ое число это было вообще жесть...сколько времени он искал и мне пришлось сделать скриншот того что он нашёл) так что думаю это вообще не путёвое дело)
1
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 09:21
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var n,m,i:integer;
begin
For n:=2 to 9999 do  {1 не совершенное, нет делителей отличных от самого числа}
 begin
  m:=1; {на 1 делятся все}
  i:=2; {начнем с 2}
  while i*i<n do {делим до корня из n}
   begin
    if n mod i = 0 then m:=m+i+n div i; {прибавим 2 делителя}
    inc(i);
   end;
  If n=m then writeln(n)
 end;
readln
end.
Добавлено через 4 минуты
Artem7, А ты в чем запускал свой код? В Паскале АВС считает также долго.
1
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 09:22
Puporev, в Abc и в Turbo

Добавлено через 11 секунд
В Turbo даже быстрее
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 09:25
Именно что в Турбо быстрее, но твой код у меня на слабеньком компьютере в АВС работает почему-то очень долго, больше 10 секунд, а мой 1 секунду.
0
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 09:28
Puporev, да у меня компу уже лет 5-6...да и разница у них в скорости всего то пару миллисекунд
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 09:34
Я тебе пишу как у меня есть по факту. У меня не просто старый комп, а именно слабый.
1.10 ГГц 512 МГб ОЗУ
А код мой быстрее из-за того что мы ищем только половину делителей.
0
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 09:42
Ну пусть мой код не такой быстрый как твой, но всё равно мой код должен быть по крайней мере быстрее в 2 раза чем тот который выложил ТС т.к в первом цикле 2 раза меньше проходов, да и во втором 2 раза меньше
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 09:42
Кстати еще можно сократить время завершения программы закончив поиск по нахождении четвертого числа, а не проверять все до 9999.
0
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 09:44
Цитата Сообщение от Puporev Посмотреть сообщение
Кстати еще можно сократить время завершения программы закончив поиск по нахождении четвертого числа, а не проверять все до 9999.
В точку)
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 09:47
Короче пусть ТС собирает все в кучу и оптимизирует...
0
1 / 1 / 1
Регистрация: 04.01.2012
Сообщений: 56
05.08.2012, 11:11  [ТС]
Не ожидал что тема вызовет такое обсуждение, поэтому спокойно спал

Вообщем вечером все соберу попытаюсь оптимизировать и отпишусь что получилось)
З.Ы. понимаю что это обращение ко мне, но все же, как ТС расшифровывается?
0
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
05.08.2012, 11:15
Dan_Shady, TC (англ.) - Theme Creator. т.е создатель темы)
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 12:03
В просторечье ТС это топик-стартер
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.08.2012, 17:29
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dan_Shady Посмотреть сообщение
возможно ли это на обычном компе?))
Возможно. Не надо перебирать тысячи чисел, которые заведомо не могут быть совершенными. У совершенных чисел есть одна особенность: в двоичной записи их сначала идут N единиц, а потом - N-1 нулей. Пример: 6 - совершенное число - переводим в двоичную запись = 1102 -> 2 единицы и 1 ноль. Следующее совершенное число = 28 = 111002 - опять совпадает: 3 единицы и 2 нуля.

А теперь "переворачиваем" алгоритм: сначала составляем строку, содержащую N единиц и (N-1) нулей, переводим ее в 10-ное число, и проверяем, является ли это число совершенным:

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
var
  i, n: longint;
  divider: integer;
 
  bin, bs: integer;
  bin_s: string;
  check, s: LongInt;
begin
  for bin := 1 to 14 do
  begin
    bin_s := '';
 
    for bs := 1 to bin do bin_s := '1' + bin_s + '0';
    bin_s := '1' + bin_s;
 
    check := 0;
    for i := 1 to length(bin_s) do check:= check * 2 + (ord(bin_s[i]) - ord('0'));
 
    s := 1;
    for divider := 2 to trunc(sqrt(check)) do
    begin
      if check mod divider = 0 then
        s := s + divider + (check div divider);
    end;
    if check = s then WriteLn(check);
  end;
end.
За сколько отработает на твоей машине эта программа? Очень быстро, правда? Если использовать 32-битный компилятор - то можно проверить еще дальше, здесь я ограничил длину двоичного представления 29 битами (при bin = 1 будет 2*bin + 1 = 3 бита, при 14 двоичное представление будет длиной 29 бит), больше в LongInt не поместится, а если есть более емкие типы (как FreePascal-евский QWord, например, который может хранить 64-битное целое), то цикл можно расширить от 1 до 30, тогда и 8-ое совершенное число будет найдено.
7
1 / 1 / 1
Регистрация: 04.01.2012
Сообщений: 56
05.08.2012, 21:32  [ТС]
Вообщем я сделал программу с поправками Puporev, получилось вот что, ну собственно как и у него)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var n,m,i,:integer;
begin
     For n:=2 to 9999 do begin
     m:=1; i:=2;
          while i*i<n do begin
               If n mod i = 0 then
                  m:=m+i+n div i;
 
                  inc(i);
            end;
          If n=m then writeln(n)
     end;
     readln
end.
программа заработала моментально)
По поводу завершения при нахождении 4-го числа, так делать не стал ибо не хочу искуственно прерывать цикл, пусть сам доделает, благо теперь быстро работает.
Теперь еще вопрос, не совсем понял почему во вложенном цикле условие i*i<n? Понимаю что так все правильно получается, но не совсем все таки понимаю почему, видимо теория хромает)


UI, спасибо за твою версию программы, очень интересный способ, позже тоже опробую, единственное не уточнил, строки еще в паскале не учил, все нужно было сделать с помощью циклов)
Вообще всем спасибо)
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 21:38
Цитата Сообщение от Dan_Shady Посмотреть сообщение
почему во вложенном цикле условие i*i<n
Потому что есть смысл искать только делители не превышающие корень из числа, дополняющие их определяются как n div i;
0
1 / 1 / 1
Регистрация: 04.01.2012
Сообщений: 56
05.08.2012, 21:57  [ТС]
Puporev, спасибо, вроде как понял все, и последний вопрос, синтаксис при написании программ в паскале school pak отличается от pascalABC? или можно спокойно перейти с первого на второй без изучения чего то нового?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
05.08.2012, 21:59
Немного отличается, если это не графика, но можно писать так же.
0
1 / 1 / 1
Регистрация: 04.01.2012
Сообщений: 56
05.08.2012, 22:01  [ТС]
графику не использую в паскале)

Ну все, значит перейду на паскальАБС, он мне больше внешне нравится)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2012, 22:01
Помогаю со студенческими работами здесь

Поиск совершенных чисел
Var i,n:longint; function P(x:longint):boolean; Var i,s:longint; begin S:=0; for i:=1 to x div 2 do if x mod i = 0 then ...

Поиск совершенных чисел
Суть задачи: Вывести n первых совершенных чисел(натуральное число называется совершенным, если равно сумме всех своих делителей, исключая...

Поиск совершенных чисел
Дано натуральное число n, целые числа {a}_{1},...,{a}_{n}. Рассмотреть отрезки последовательности (последовательности членов, идут рядом),...

Поиск совершенных чисел
Нужно написать программу для поиска совершенных чисел. Вот код int main() { int a=1,c,n=1,delitel; while(a&lt;=10000) { ...

Поиск совершенных чисел от 1 до n
Здравствуйте! Решаю несложную задачу на поиск все совершенных чисел от 1 до n. Вот код: #include &lt;bits/stdc++.h&gt; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru