Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67

Составить программу поиска всех чисел, имеющих k разных простых делителей

26.04.2022, 17:06. Показов 1968. Ответов 32

Студворк — интернет-сервис помощи студентам
Описать функцию f(x) – количество разных обычных делителей числа х. Составить программу поиска всех
чисел, имеющих k разных простых делителей.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2022, 17:06
Ответы с готовыми решениями:

Составить программу поиска всех чисел, имеющих k различных простых делителей
Описать функцию f (x) - количество различных простых делителей числа х. Составить программу поиска всех чисел, имеющих k различных простых...

Составить программу для нахождения чисел из интервала [М, N], имеющих наибольшееколичество делителей
4. Составить программу для нахождения чисел из интервала , имеющих наибольшее количество делителей.

Составить программу для нахождения чисел из интервала [М, N], имеющих наибольшее количество делителей
Составить программу для нахождения чисел из интервала , имеющих наибольшее количество делителей. Нужен код

32
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
13.05.2022, 13:08  [ТС]
Студворк — интернет-сервис помощи студентам
Последний раз обращаюсь ко всем. Вроде переписала код, но все равно пишет ошибку. В строке 34 пишет "Ошибка времени выполнения: Индекс находился вне границ массива". Как её устранить?
Ошибка
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
program qq;
function F(n:integer):integer;
var d:integer;
begin
  result:=0;
  if n=0 then exit;
  if not odd(n) then begin
    inc(result);
    repeat n:=n div 2;
    until odd(n);
  end; 
  d:=3;
  while 
  d<=n do begin
    if n mod d=0 then begin
      inc(result);
      repeat n:=n div d;
      until n mod d<>0;
      end;
      inc(d,2);
    end;
  end;
  const N =5;
  type mas = array[1..N] of integer;  
 var i,k:integer; 
 a:mas;
  begin  
   for i := 1 to N do begin     
   write('a[', i, ']=');     
   readln(a[i]);  end; 
   write('введите количество делителей,k '); 
   readln(k);
   for i:=0 to n do
     if k=F(a[i]) then write(' ',a[i]); 
   writeln;
end.
Добавлено через 1 час 1 минуту
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
13.05.2022, 13:46
У вас массив от 1 до N, а в строке 34 цикл от 0 до N, соответственно, при обращении к несуществующему a[0] индекс находился вне границ массива.
Догадались что делать? Правильно, перебирать только существующие элементы.
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
17.05.2022, 23:08  [ТС]
Учителю не понравились некоторые моменты, я переделала, но все равно что-то не так, посмотрите пожалуйста и подскажите. Не хочет работать программа...
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
program qq; 
type mas = array of integer;
var i,j,k,c:integer;     
a:mas;
Function F(var n,i,k,b,j:integer):integer;
begin
  k:=0;
  for i:=1 to n do begin
    if n mod i =0 then 
      begin
        b:=0;
        for j:=2 to i div 2 do      
          if i mod j=0 then 
            begin  
            b:=1; break end; 
        if b=0 then k:=k+1; begin 
        end;
      end;
 end;
end;
  const N =5;
        begin  
   for i := 1 to N do begin     
   write('a[', i, ']=');     
   readln;  end; 
   writeln('введите количество делителей,c '); 
   readln(c);
    for i:=1 to n do
     if k=F(a[i]) then write(' ',a[i]); 
   writeln;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
18.05.2022, 09:13
Ввели C, а сравниваете с K.

Добавлено через 7 минут
Подсчёт простых делителей очень не оптимальный. Можно сократить количество проверок вдвое, если проверять само число отдельно. Можно сократить до корня квадратного, если проверять парные делители.
Но это будет все-равно медленнее, чем в сообщении #14 этой темы (разложение на простые множители).
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
18.05.2022, 10:48  [ТС]
Я пробовала вводить и k, но все равно не работает. Должно быть и в начале k, и в конце k? Преподаватель сказал именно такой вариант расчёта нужен. Я уже пробовала сдавать такой, который вы писали. Помогите доделать пожалуйста
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,532
18.05.2022, 21:25
bormant, искать до корня из числа - это вряд ли, посколькв этом случае простота делителей от корня из числа до половины числа проверена никак не будет. Так что, искать простые делители нужно до половины числа. Проверять само число на простоту незачем.

Если совсем просто и не оптимально, то примерно так:
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 f(x: integer): integer;
var
  k, i, d: integer;
begin
  k := 0;
  d := x div 2;
  i := 2;
  while (i <= d) and (x > 1) do
    begin
      if x mod i = 0 then
        begin
          inc(k);
          while x mod i = 0 do x := x div i
        end;
      inc(i)
    end;
  if k > 0 then f := k else f := 1
end;
 
const
  n = 5;
var
  a: array[1..n] of integer;
  i, c: integer;
begin
  for i := 1 to n do
    begin
      write('a[', i, '] = ');
      readln(a[i])
    end;
  write('c = ');
  readln(c);
  for i := 1 to n do
    if f(a[i]) = c then write(' ', a[i]);
  readln
end.
Добавлено через 13 минут
Хотя, зря я это написал... И до меня уже всё написано, зачем повторяться... Ну да ладно, оставлю это здесь.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
18.05.2022, 22:05
Цитата Сообщение от rittka Посмотреть сообщение
все равно не работает
Да о какой работе может идти речь, если оно элементарно не компилируется?

Хорошо, давайте посмотрим.
Цитата Сообщение от rittka Посмотреть сообщение
Преподаватель сказал именно такой вариант расчёта нужен
Вариант расчета чего?
Отделим мух от котлет. Текущий ваш вариант подсчета делителей явно разделим на 2 части -- поиск делителя и проверку на простоту:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function IsPrime(n: Longint): Boolean;
var i: Longint;
begin
  IsPrime:=False;
  for i:=2 to n div 2 do
    if n mod i=0 then Exit;
  IsPrime:=True;
end;
 
function f(n: Longint): Longint;
var r, i: Longint;
begin
  r:=0;
  for i:=2 to n do
    if (n mod i=0) and IsPrime(i) then Inc(r);
  f:=r;
end;
Очевидно, что обе части сильно неоптимальны. Кроме того,
1) исходная проверка на простоту считает 1 простым числом, что неправильно,
2) в исходной проверке использование цикла от 1 (которая заведомо не является простым числом) при переборе делителей приводит к неверным результатам.

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

Добавлено через 11 минут
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
искать до корня из числа - это вряд ли, посколькв этом случае простота делителей от корня из числа до половины числа проверена никак не будет
С учетом того, что делители за исключением полного квадрата парные (если n mod k=0, то и n mod (n div k)=0), то и никакой проблемы нет, и дополнительного перебора не нужно, чтобы их найти.

Добавлено через 4 минуты
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
зачем повторяться...
Ну а вдруг ваше кунг убеждение-фу сильнее моего
1
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,532
18.05.2022, 22:42
bormant, n div k не обязано быть простым в том случае, если k - простое. Например, n = 12, k = 2, n div k = 6; n = 10, k = 2, n div k = 5.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
19.05.2022, 00:08
Cyborg Drone,
Только это ни на что не повлияет, правда?
Проверяем же на простоту и первый, и парный.
Pascal
1
2
3
4
if n mod i=0 then begin
  if IsPrime(i) then Inc(k);
  if IsPrime(n div i) then Inc(k);
end;
Добавлено через 10 минут
Только помним про особые случаи: отдельно полный квадрат и отдельно само число.
0
Модератор
10477 / 5772 / 3412
Регистрация: 17.08.2012
Сообщений: 17,532
19.05.2022, 01:08
Тогда да, ни на что не повлияет.

По-моему, быстрее делить число на его простые делители до половины числа, нежели проверять пары делителей на простоту до корня из числа.
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
19.05.2022, 10:06
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
По-моему, быстрее делить число на его простые делители до половины числа, нежели проверять пары делителей на простоту до корня из числа.
а по моему - нет.
возьмём, например, число 1000000 (1 миллион)
если проверять до половины числа, то понадобится 500 тысяч проверок, если до корня - то всего 1000 проверок,, что примерно в 500 раз меньше.
и с увеличением чисел эта разница будет только увеличиваться.


к слову. формулировка задания в виде
Цитата Сообщение от rittka Посмотреть сообщение
Составить программу поиска всех
чисел, имеющих k разных простых делителей
очень сомнительна. Из контекста решения видно, что речь идёт лишь о тех числах, которые внесены в программу. Тогда и в задании должно быть. "Составить программу для ввода N натуральных чисел и выбора из них тех, которые имеют ровно k простых делителей." имхо.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
19.05.2022, 11:19
mr-Crocodile,
пример нерелевантный
Посыл был в том, что делить на простые (по таблице), хоть и до половины, быстрее, чем проверять на простоту, пусть и до квадратного корня. Дорогая операция тут собственно проверка на простоту.

Добавлено через 6 минут
Но как только добавим таблицу простых, так и проверка на простоту становится проверкой по индексу или в худшем случае бинарным поиском по этой таблице. И снова всё не так однозначно, тут и разложение на простые множители проиграет обоим вариантам.
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
19.05.2022, 12:10
bormant, да, понял, согласен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.05.2022, 12:10

Составить программу для нахождения чисел из промежутка [M; N], имеющих наибольшее количество делителей
Составить программу для нахождения чисел из промежутка , имеющих наибольшее количество делителей.

Составить программу для нахождения чисел из интервала [M, N], имеющих наибольшее количество делителей
2. Составить программу для нахождения чисел из интервала , имеющих наибольшее количество делителей.

Составить программу вычисления количества всех делителей всех чисел от 1 до n
Дано натуральное число n.Составить программу вычисления количества всех делителей всех чисел от 1 до n

Составить программу, которая вычисляет количество S всех делителей и сумму Y всех делителей натурального числа N
1. Дано натуральное число N (N&lt;104). Составить программу, которая вычисляет количество S всех делителей и сумму Y всех делителей...

Составить программу печати всех простых чисел до 500
Составить программу печати всех простых чисел до 500 c помощью for


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru