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

Вывести первые N (N<5) совершенных чисел

24.11.2017, 15:04. Показов 4716. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Натуральное число называется совершенным, если оно равно сумме всех своих делителей, включая единицу. Например, 6=1+2+3 – число совершенное. Вывести первые N (N<5) совершенных чисел на экран.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2017, 15:04
Ответы с готовыми решениями:

Вывести первые N совершенных чисел
пользователь вводит число N.и программа должна вывести первые N совершенных чисел

Вывести первые N (N<5) совершенных чисел на экран
Натуральное число называется совершенным, если оно равно сумме всех своих делителей, включая единицу и исключая себя. Например, 6=1+2+3 –...

Найти первые 4-е совершенных числа
Определить и напечатать значения первых 4-ех совершенных чисел. Совершенное число является числом, которое равно сумме своих делителей,...

2
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,433
24.11.2017, 19:54
Вычислить количество простых и совершенных чисел
0
Модератор
10430 / 5718 / 3404
Регистрация: 17.08.2012
Сообщений: 17,389
26.11.2017, 16:56
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Программа по ссылке верная, только вот не вполне соответствует заданию. Можно, конечно, немножко её переделать, и написать нечто такое:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const m = 5;
var i, j, n, k, s: longint;
begin
  repeat
    write('Количество совершенных чисел [1..', m, '];  n = ');
    readln(n)
  until (1 <= n) and (n <= m);
  k := 5;
  for i := 1 to n do
    repeat
      inc(k);
      s := 0;
      for j := 1 to k div 2 do if k mod j = 0 then s := s + j;
      if k = s then write(' ', k)
    until k = s;
  readln
end.
Вроде бы простенько и со вкусом. Одна беда - умумукаешься ждать, пока эта святая простота пятое совершенное число выдаст. Поэтому следует признать, что ни эта программа, ни, тем более, программа по ссылке, никуда не годятся. Нужно как-то ускорить работу программы. Этим и займёмся. Возьмём на вооружение старую швабру автомат Калашникова базуку хоть что-нибудь теорему Евклида о совершенных числах:

Теорема Евклида о совершенных числахВ тех случаях, когда число 2p-1 - простое, число 2p-1(2p-1) является совершенным.


Уже не придётся проверять все числа. Мало того, проверить 2p-1 на простоту - это быстрее, чем проверить 2p-1(2p-1) на совершенство, поэтому так и сделаем:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const m = 5;
var i, j, n, d, q: longint;
    is_prime: boolean;
begin
  repeat
    write('Количество совершенных чисел [1..', m, '];  n = ');
    readln(n)
  until (1 <= n) and (n <= m);
  d := 1;
  for i := 1 to n do
    repeat
      d := 2 * d;
      q := 2 * d - 1;
      is_prime := true;
      for j := 3 to trunc(sqrt(q)) do
        begin
          is_prime := q mod j <> 0;
          if not is_prime then break
        end;
      if is_prime then write(' ', d * q)
    until is_prime;
  readln
end.
Прям не программа, а гоночный болид. И это несмотря на то, что используется едва ли не самый медленный алгоритм проверки числа на простоту. Ну, разве что, немножко ускоренный упрощением, поскольку q в любом случае больше 2. Полагаю, эта программа более всего подойдёт для сдачи задания. Небольшая и вполне понятная. Но... Попробуем ещё немножко ускориться. Можно ведь, если быть уверенным в своих силах, и две программы сдать, будет только лучше.

Числа вида 2p-1 - это числа Мерсенна. Известно, что число Мерсенна может является простым только в том случае, если p - простое число. Конечно, совсем не обязательно, что в случае простого p число 2p-1 будет простым, но хорошо уже то, что в случае составного p число 2p-1 быть простым ну никак не может. p проверить на простоту быстрее, чем 2p-1, правда, придётся потом и 2p-1 на простоту проверять, но зато отсеивается изрядная доля составных 2p-1. Получается, что проверка на простоту будет в двух местах программы, поэтому оформим (упрощённую и медленную) проверку на простоту в виде подпрограммы:
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
30
31
32
33
34
35
36
function is_prime(x: integer): boolean; //эта функция не подходит для x < 3
var k: integer;
begin
  is_prime := true;
  for k := 3 to trunc(sqrt(x)) do
    if x mod k = 0
      then begin
        is_prime := false;
        break
      end
end;
 
const m = 5;
var i, n, d, q, p: longint;
    ex: boolean;
begin
  repeat
    write('Количество совершенных чисел [1..', m, '];  n = ');
    readln(n)
  until (1 <= n) and (n <= m);
  d := 1;
  p := 1;
  for i := 1 to n do
    repeat
      d := 2 * d;
      inc(p);
      ex := false;
      if is_prime(p)
        then begin
          q := 2 * d - 1;
          ex := is_prime(q);
          if ex then write(' ', d * q)
        end
    until ex;
  readln
end.
Совсем хорошо. Можно, конечно, ещё быстрее программу заставить работать, применив более быстрый алгоритм проверки на простоту, но... Надо ли? Максимально, что может поместиться в стандартные типы данных (если не считать BigInteger из Pascal ABC.Net), это совершенное число №7, равное 2305843008139952128, которое влезает в типы int64 и uint64, которые, кстати, в Turbo Pascal и в простом Pascal ABC (без суффикса .Net) отсутствуют, но и в этом случае (если объявить d, q, p, x как int64 и декларировать m = 8) программа результат выдаёт мгновенно.

Замечу, что оптимальное решение этой задачи выглядит как-нибудь так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
const m = 5;
      s: array[1..m] of integer = (6, 28, 496, 8128, 33550336);
var n: integer;
begin
  repeat
    write('Количество совершенных чисел [1..', m, '];  n = ');
    readln(n)
  until (1 <= n) and (n <= m);
  for n := 1 to n do write(' ', s[n]);
  readln
end.
поскольку небольшое количество чисел разумнее декларировать, чем рассчитывать. Но для сдачи это вряд ли подойдёт.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2017, 16:56
Помогаю со студенческими работами здесь

Вывести все совершенные числа на экран и указать количество совершенных чисел меньше n
Дано некоторое число n. Составить программу для нахождения всех совершенных чисел меньших n. Вывести все совершенные числа на экран и...

Вывести все совершенные числа на экран и указать количество совершенных чисел меньших n
Дано натурально число n. Составить программу, для нахождения всех совершенных чисел меньших n. Вывести все совершенные числа на экран и...

Вывести первые N (N<5) совершенных чисел на экран
Прошу помочь найти ошибку в решении данной задачи. Формулировка такова: Натуральное число называется совершенным, если оно равно сумме...

Вывести на экран первые пять совершенных чисел
Помогите пожалуйста с программой. 32. Вывести на экран первые пять совершенных чисел (функция возвращает 1, если число совершенное, 0 – в...

Вывести количество совершенных чисел в интервале [a, b]
Число назывется совершенным, если оно равно сумме своих собственных делителей. Собственными делителями имеются ввиду те делители числа,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru