Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 10.10.2021
Сообщений: 10

Найти сумму целых чисел из промежутка [n1; n2], у которых ровно 5 делителей

10.10.2021, 18:42. Показов 3157. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти сумму целых чисел из промежутка [n1; n2], у которых ровно 5 делителей. Каждое
из таких чисел выдать на печать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2021, 18:42
Ответы с готовыми решениями:

Найти сумму целых чисел из промежутка от 1 до 200, у которых ровно 5 делителей
Найти сумму целых чисел из промежутка от 1 до 200, у которых ровно 5 делителей! помогите пожалуйста

Найти сумму целых чисел из промежутка от 1 до 200 у которых ровно 5 делителей
1. Найти сумму целых чисел из промежутка от 1 до 200 у которых ровно 5 делителей. (Тип к преобразованию чисел: Integer; а в программе нужно...

Найти сумму целых чисел из промежутка от 1 до 200, у которых ровно 5 делителей
Помогите пожалуйста Найти сумму целых чисел из промежутка от 1 до 200, у кото-рых ровно 5 делителей

16
Модератор
10442 / 5734 / 3406
Регистрация: 17.08.2012
Сообщений: 17,443
10.12.2021, 00:45
Лучший ответ Сообщение было отмечено Mallina как решение

Решение

Можно, конечно, перебирать все числа, и проверять, имеет ли текущее число ровно пять делителей. Но - это так себе идея, поскольку при большом интервале [n1; n2] программа будет настолько медленно работать, что результат придётся ждать НЕСКОЛЬКО ДНЕЙ. Подобная задача есть вот в этой теме: Найдите все числа, принадлежащие заданному отрезку, у которых ровно пять различных нечётных делителей. Там все программы считают очень-очень долго, кроме программы, которую написал я в последнем сообщении, она выдаёт результат практически мгновенно (по моим оценкам, примерно за четверть секунды). Так что... Будем писать человеческое решение.

Итак, повторим предварительные соображения применительно к Вашему заданию.

Заметим, что в Вашем задании говорится про целые числа, а не про натуральные. Будем искать только положительные делители числа, поскольку количество всех делителей числа чётное (количества отрицательных и положительных делителей одинаковые, и сумма этих двух равных чисел является чётным числом).

Нечётное количество (положительных) делителей может быть только у чисел, модуль которых является полным квадратом. У таких чисел, кроме чисел -1, 0, 1, модуль числа имеет минимум 3 делителя: 1, корень квадратный из модуля числа и модуль числа. Остальные делители, если они есть, располагаются поровну в интервалах от 2 до корня из модуля числа - 1 и от корня из модуля числа + 1 до половины модуля числа. Таким образом, чтобы число имело ровно 5 делителей, достаточно, чтобы модуль числа был полным квадратом и имел ровно один делитель в интервале от 2 до корня из модуля числа - 1.

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

Необходимо будет предварительно для числа n1 найти наименьшее большее число, входящее в интервал, а для n2 наибольшее меньшее число, входящее в интервал, такие, чтобы модули их были полными квадратами.

Пишем программу.
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
37
38
39
40
41
42
43
var
  n1, n2, k, a, b, q, p, m, d, z: integer;
  {n1, n2 - интервал чисел, k - количество чисел,
  a, b - интервал чисел, квадраты которых принадлежат интервалу [n1; n2],
  q, p - счётчики циклов, m - модуль числа, d - количество делителей, z - знак числа}
  s, t: real;
  {s - сумма чисел, t - временная переменная}
begin
  //ввод интервала
  write('n1 = ');
  readln(n1);
  write('n2 = ');
  readln(n2);
  //нахождение минимального значения счётчика (наименьшее большее)
  t := sqrt(abs(n1));
  if n1 < 0 then a := -trunc(t)
  else if frac(t) <> 0 then a := trunc(t) + 1;
  //нахождение максимального значения счётчика (наибольшее меньшее)
  t := sqrt(abs(n2));
  if n2 > 0 then b := trunc(t)
  else if frac(t) <> 0 then b := -trunc(t) - 1;
  //далее ищем числа
  writeln('Числа, имеющие ровно 5 делителей:');
  k := 0; //числа пока не найдены
  s := 0; //сумма чисел пока 0
  for q := a to b do //*** цикл по корням из модулей чисел, умноженных на знаки чисел
    begin
      if q < 0 then z := -1 else z := 1; //знак числа
      m := q * q; //модуль числа
      d := 0; //делители пока не найдены
      for p := 2 to abs(q) - 1 do if m mod p = 0 then inc(d); //цикл подсчёта количества делителей
      if d = 1 then //если число имеет ровно 5 делителей, то
        begin
          inc(k); //увеличиваем счётчик чисел
          m := z * m; //восстанавливаем значение числа
          writeln(m); //печатаем число
          s := s + m //добавляем число к сумме
        end
    end; //*** конец цикла по корням из модулей чисел, умноженных на знаки чисел
  //далее, если числа найдены, то печатаем сумму, иначе печатаем, что числа не найдены
  if k > 0 then writeln('Сумма чисел = ', s:0:0) //если числа найдены, то печатаем сумму
  else writeln('не найдены') //иначе печатаем, что числа не найдены
end.
Если Вы считаете, что сдать эту программу Вам не удастся, либо алгоритм программы сложен для Вас, пишите, я напишу программу с полным перебором всех чисел.
2
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
10.12.2021, 06:35
Лучший ответ Сообщение было отмечено Mallina как решение

Решение

Cyborg Drone, можно использовать такой факт из теории чисел
Если число N имеет пять делителей, то оно имеет вид https://www.cyberforum.ru/cgi-bin/latex.cgi?{p}^{4}, где p – простое число.
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 n1, n2, p1, p2, i, p, k: integer;
    s, t: real;
begin
 write('n1 = ');
 readln(n1);
 write('n2 = ');
 readln(n2);
 p1:= round(sqrt(sqrt(n1))); 
 p2:= round(sqrt(sqrt(n2)))+1; 
 s:= 0;
 for p:= p1 to p2 do 
  begin  
   k:=0; 
   for i:=2 to round(sqrt(p)) do 
    if p mod i = 0 then k:=k+1; 
   if (k=0) and (p*p*p*p>=n1) and (p*p*p*p<=n2) 
    then
     begin
      t:= p*p*p*p;
      writeln(t);
      s:= s + t; 
     end;
  end;
 if s > 0 
  then writeln('Сумма чисел = ', s:0:0) //если числа найдены, то печатаем сумму
  else writeln('не найдены')
end.
3
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
10.12.2021, 11:20
thyrex, всё красиво, кроме того, что Вы явно забыли, что целые числа бывают и отрицательными.

попробуйте своей программой определить, сколько чисел имеют ровно 5 делителей в диапазоне от -100 до -1
0
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
10.12.2021, 15:58
mr-Crocodile, в задачах подобного плана (на число делителей) отрицательные числа не используются по умолчанию. Подобные задачи и такие закономерности из теории чисел полезны скорее для олимпиадного программирования, или для подготовки к ЕГЭ. А даже ЕГЭ в России, насколько я понял, сдают не все.
1
0 / 0 / 0
Регистрация: 10.10.2021
Сообщений: 10
10.12.2021, 16:48  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var i,j,k,s:integer; 
begin 
writeln('Числа из интервала, имеющие ровно 5 делителей:'); 
s:=0; 
for i:=2 to 200 do 
 begin 
 k:=2;{все больше 1 имеют минимум 2 делителя} 
 for j:=2 to i div 2 do{находим остальные} 
 if i mod j=0 then k:=k+1; 
 if k=5 then 
 begin 
 s:=s+i; 
 writeln(i); 
 end; 
 end; 
writeln('Их сумма=',s); 
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
10.12.2021, 18:22
Цитата Сообщение от thyrex Посмотреть сообщение
в задачах подобного плана (на число делителей) отрицательные числа не используются по умолчанию
Вот будет в задании не
Найти сумму целых чисел
, а
Найти сумму натуральных чисел
, вот тогда и будем обсуждать только положительные.
А пока извините,
Целые числа -- расширение множества натуральных чисел, получаемое добавлением к нему нуля и отрицательных чисел.
Натуральные числа -- числа, возникающие естественным образом при счёте (1, 2, 3, 4, 5, 6, 7 и так далее).

Добавлено через 3 минуты
Тут играем, тут не играем, тут рыбу заворачивали.
2
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
11.12.2021, 08:21
Цитата Сообщение от bormant Посмотреть сообщение
А пока извините
ну тогда назовите хотя бы одно целое отрицательное число, имеющее нечетное число делителей
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.12.2021, 09:08
thyrex,
выбирайте: -1 (1), -4 (1, 2, 4), -9 (1, 3, 9), ...

Добавлено через 11 минут
Или ближе к теме обсуждения: -16 (1, 2, 4, 8, 16), -81 (1, 3, 9, 27, 81), ..., -p4.
0
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
11.12.2021, 09:08
А где сказано в условии, что делители должны быть только натуральными? Стало быть у любого отрицательного числа всегда четное число делителей.

А для натуральных чисел и делители могут быть только натуральными.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.12.2021, 09:30
Цитата Сообщение от thyrex Посмотреть сообщение
для натуральных чисел и делители могут быть только натуральными
Как только допустите существование не натуральных (целых) делителей, так сразу и
1 (1, -1), 2 (1, 2, -1, -2), ...

Речь в задании шла о
сумме делителей целых чисел
, а не о
сумме целых делителей целых чисел.
Почувствовали разницу?

Замечание mr-Crocodile к коду было о целых числах из условия, а не о целых делителях. Согласитесь, та же огромная разница.

Добавлено через 3 минуты
То есть замечание по сути о том, что:
1) не хватает Abs,
2) не хватает проверки для случая p1>p2.
1
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
11.12.2021, 10:16
Я разницу давно почувствовал: нужно сначала уточнять у автора темы точную формулировку задания и только потом потом писать алгоритм решения, а не строить домыслы. Когда не знали о существовании отрицательных чисел, вопрос решался сам собой: натуральные числа, натуральные делители. Только в этом случае их количество может быть нечетным. А предполагать, что у натуральных чисел есть еще и ненатуральные делители - это во времена инквизиции прямая дорога на костер

А в поисках формулировок откройте любое задание №25 из ЕГЭ по информатике. Там все весьма прозрачно.

К сожалению, статьи на сайте журнала «Информатика в школе» не доступны без платной подписки любому желающему. В одной из них и описывается методика решения задач на данную тему, в которых полный перебор нерационален. Общая формулировка подобных задач
Найдите среди целых чисел, принадлежащих числовому отрезку [n1; n2], числа, имеющие ровно k различных натуральных делителей с заданным свойством.
Рассматривается несколько примеров, в одном из которых
Найдите среди целых чисел, принадлежащих числовому отрезку [n1; n2], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. В ответе перечислите найденные числа.
без всяких лишних домыслов рассматривается решение только для натуральных n1 и n2. Предлагаете написать гневное письмо в редакцию журнала?

На сим предлагаю все же закончить дебаты по данной теме.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
11.12.2021, 10:34
Цитата Сообщение от thyrex Посмотреть сообщение
Предлагаете написать гневное письмо в редакцию журнала?
Предлагаю для тестирования давать интервал [-100;-1], весна покажет, кто где, кхм, программировал.

Добавлено через 1 минуту
Цитата Сообщение от thyrex Посмотреть сообщение
без всяких лишних домыслов рассматривается решение только для натуральных n1 и n2
С.В.Лавров и здесь не подвел.

Добавлено через 1 минуту
Цитата Сообщение от thyrex Посмотреть сообщение
Найдите среди целых чисел, принадлежащих числовому отрезку [n1; n2], числа, имеющие ровно два различных натуральных делителя
Цитата Сообщение от thyrex Посмотреть сообщение
рассматривается решение только для натуральных n1 и n2
О каких "дебатах" может идти речь в данном случае, решительно не понимаю.
Решение одного частного случая из условия задачи не является решением задачи, не так ли?

Добавлено через 4 минуты
Еще раз:
-100 целое число? Да.
-1 целое число? Да.
Отрезок [-100;-1] соответствует условию "целые числа, принадлежащие числовому отрезку [n1; n2]"? Да.
Код выводит правильный ответ для этого отрезка?
Если ДА -- решение для этого отрезка верное.
Если НЕТ -- решение неверное.

Добавлено через 1 минуту
Бонус: решение из #3 может быть модифицировано для общего случая? Да.

Добавлено через 6 минут
Хинт: при модификации стоит держать в уме и отрезок [-100;100]
1
Модератор
10442 / 5734 / 3406
Регистрация: 17.08.2012
Сообщений: 17,443
12.12.2021, 10:45
Цитата Сообщение от thyrex Посмотреть сообщение
Если число N имеет пять делителей, то оно имеет вид p4, где p – простое число
Спасибо, не знал. Или уже забыл. Тогда получается ещё эффективнее:
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
var
  n1, n2, k, a, b, q, p, m, d: integer;
  s, t: real;
begin
  write('n1 = ');
  readln(n1);
  write('n2 = ');
  readln(n2);
  t := sqrt(sqrt(abs(n1)));
  if n1 < 0 then a := -trunc(t)
  else if frac(t) <> 0 then a := trunc(t) + 1;
  t := sqrt(sqrt(abs(n2)));
  if n2 > 0 then b := trunc(t)
  else if frac(t) <> 0 then b := -trunc(t) - 1;
  writeln('Числа, имеющие ровно 5 делителей:');
  k := 0;
  s := 0;
  for q := a to b do
    if abs(q) > 1 then
      begin
        d := 0;
        for p := 2 to trunc(sqrt(abs(q))) do if q mod p = 0 then inc(d);
        if d = 0 then
          begin
            inc(k);
            m := q * q * q * abs(q);
            writeln(m);
            s := s + m
          end
      end;
  if k > 0 then writeln('Сумма чисел = ', s:0:0)
  else writeln('не найдены')
end.
Насчёт делителей целого числа. thyrex, по поводу всего множества делителей я написал в после #2, что их, по понятной причине, чётное количество. И, чтобы не ломать копья... В любом учебнике при рассмотрении делителей целого числа написано что-то вроде этого: "любое целое число имеет и отрицательные, и положительные делители, но, так как каждый отрицательный делитель противоположен соответствующему положительному делителю, обычно рассматриваются только положительные делители". Получается, что, если рассматривается всё множество делителей целого числа, то это не "обычно", и должно быть указано явно, что имеется ввиду всё множество делителей. Такая вот путаница.
1
13.12.2021, 11:26

Не по теме:

боюсь, что автор вопроса, Mallina, окончательно запуталась и потерялась в обсуждении...

0
0 / 0 / 0
Регистрация: 10.10.2021
Сообщений: 10
13.12.2021, 12:28  [ТС]
mr-Crocodile, все очень интересно, я в теме. Я неожидала, что данная задача вызовет такой интерес, хах
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
13.12.2021, 13:28
Mallina,
да уж. задачка-то на теорию чисел. Вышло неожиданно интересно, познавательно и остро!

и я крайне настоятельно рекомендую отказаться от того алгоритма, что использовался у тебя в пост #6,
а взять алгоритм Cyborg Drone.
Ну, а если ты уверена, что у тебя числа n1,n2 - это ИСКЛЮЧИТЕЛЬНО натуральные числа (то есть отрицательных по условию быть не может), тогда можешь брать код thyrex.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2021, 13:28
Помогаю со студенческими работами здесь

Найти сумму целых чисел из промежутка от 1 до 200, у которых ровно 5 делителей
Здравствуйте уважаемый программисты. Помогите написать текст программы с использованием подпрограмм (функции). Вот задачb: Найти сумму...

Найти количество целых чисел из промежутка от 5 до 40, у которых сумма делителей больше 15
Найти количество целых чисел из промежутка от 5 до 40, у которых сумма делителей больше 15 (паскаль)

Найти все числа из промежутка от a до b, у которых ровно 5 делителей
Помогите решить задачу в Visual C#. Найти все числа из промежутка от a до b, у которых ровно 5 делителей. Внимательнее выбирайте...

Найти все целые числа, из промежутка от a до b у которых ровно n делителей
Найти все целые числа, из промежутка от a до b у которых ровно n делителей. Значения a, b и n вводится с клавиатуры Помогайте пожалуйста

Найти все целые числа из промежутка от а до b у которых ровно n делителей
Найти все целые числа из промежутка от а до b у которых ровно n делителей


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru