Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 483

/ вопрос решён /

Здравствуйте, эксперты!
возник такой вопрос: нужно найти число, находящееся на отрезке [ a, b ], имеющее наибольшее количество делителей? Помогите ПОЖАЛУЙСТА!!!!

I{ () T Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 4 марта 2009, 18:09
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, I{ () T!
Делители искать просто. Где тот так

function HowManyDiv(n:integer):integer;
var i,k:integer;
begin
  k := 0;
  for i := 2 to n div 2 do
    if n mod i = 0 then k:= k+1;
  result := k;
end;

а теперь поиск максимума
maxn =a;
maxk = HowManyDiv(maxn);
for i:=a+1 to b do
  begin
    k := HowManyDiv(i);
    if k>maxk then begin
      maxk := k;
      maxn := i;
    end;
  end;
//вывод maxn - собственно числа и maxk - его кол-ва делителей
Думаю, что если надо будет сделать вывод самих делителей, то это будет не сложно:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 марта 2009, 19:30
Оценка за ответ: 5

Комментарий к оценке: ВЫРУЧИЛИ!!! ОГРОМНОЕ СПАСИБО!! действительно легко оказалось. а я вообще через цикл делал. и запутался вконец. ЕЩЕ РАЗ СПАСИБО!

Ответ #2. Отвечает эксперт: min@y™

Цитата:

нужно найти число, находящееся на отрезке [ a, b ], имеющее наибольшее количество делителей


Не всё так просто. На отрезке [ a, b ] чисел с максимальным кол-вом делителей может быть больше одного! Например, на отрезке [2, 100] их аж 5 штук: 60, 72, 84, 90, 96 (у всех кол-во делителей = 12). Я написал демо-программку, которая находит и выводит такие числа. Вот результат её работы, скопированный из консоли:
 --- Values with max count of dividers (total: 5) ---
 
Dividers of "60" (total: 12):
1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60
 
Dividers of "72" (total: 12):
1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72
 
Dividers of "84" (total: 12):
1, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42, 84
 
Dividers of "90" (total: 12):
1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90
 
Dividers of "96" (total: 12):
1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 96

Саму программу прицепляю к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 4 марта 2009, 20:23
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 21; последнее сообщение — 7 марта 2009, 11:34; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 4 марта 2009, 18:49 [#1]:

а умеем искать кол-во делителей и максимальное число в массиве? (по отдельности)
Галочка "подтверждения прочтения" - вселенское зло.
I{ () T

I{ () T (статус: Посетитель), 4 марта 2009, 19:04 [#2]:

увы нет. такое к сожалению еще не прошел.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 4 марта 2009, 20:16 [#3]:

извините, я только учусь на delphi поэтому не могли бы разъяснить, как понять HowManyDiv, как его в программе писать, то бишь чем заменить?
P.S.на счет циклов ошибка вышла. не разглядел сразу.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 4 марта 2009, 20:29 [#4]:

так...а можно ведь как то условие поставить чтобы выводило те числа, у которых количество делителей одинаково?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

min@y™ (статус: Доктор наук), 4 марта 2009, 20:45 [#5]:

Цитата:

так...а можно ведь как то условие поставить чтобы выводило те числа, у которых количество делителей одинаково?


Их можно разделить и выводить по группам, типа:
2 делителя ---> 2, 3, 5, 7, 11, 13, 17,...
3 делителя ---> 4, 9, 25, 49,...
4 делителя ---> 6, 8, 10, 14, 15,...
..........
12 делителей ---> 60, 72, 84, 90, 96

Но изначально задача поставлена на поиск числа (чисел) с максимальным кол-вом делителей.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 5 марта 2009, 17:02 [#6]:

А делители любые? Или натуральными должны быть.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 5 марта 2009, 17:10 [#7]:

Для не натуральных (для не целых, если быть точным) данная задача лишена смысла.
Галочка "подтверждения прочтения" - вселенское зло.
DNK

DNK (статус: Студент), 6 марта 2009, 17:11 [#8]:

Прошу прощения: простых, конечно же.
Экскурс в основы математики.
Простое число - это число делящееся только на единицу или на само себя. Из курса математики за 6 класс помню, при задаче поиска делитлей числа искался именно ряд простых чисел. (4, 6, 8, 9 и тп - не простые числа, ответ min@y™)
2Вадим К : Функция HowManyDiv в любом случае выдаст n div 2-1, так как (i mod i) по определению нуль.
Основная функция выдаст: "Неизвестный идентификатор 'kl'"(по наитию писали :-), подозреваю там должно быть вместо 'l' точка с запятой). Но и если учесть это, так как HowManyDiv будет равномерно будет возрастать, то основной цикл в любом случае выдаст "maxk = b div 2 -1" , а "maxn = b" для нечётного "b" и "maxn=b-1" для чётного.

Я рассуждаю, так что жду полемики...
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 6 марта 2009, 17:35 [#9]:

по поводу kl - да, l и точка с запятой рядом. На работе не всегда есть возможность в редакторе писать.
if i mod i = 0 и здесь тоже. надо
if n mod i = 0

6 будет делителем 12, хотя 6 и не является простым. А то, о чем вы говорите называется "разложением на простые множители". А человеку надо "кол-во делителей".

Полемики хотите? а не боитесь?
Галочка "подтверждения прочтения" - вселенское зло.
DNK

DNK (статус: Студент), 6 марта 2009, 18:23 [#10]:

2 Вадим К: Так как по жизни везёт, всегда ищю приключений.

2 I{ () T: По поводу множителей жду твоих уточнений.
"Digital Networked Knight"
I{ () T

I{ () T (статус: Посетитель), 6 марта 2009, 18:31 [#11]:

делители натуральные конечно! пожалуйста, если не сложно напиши мне эту программу(((( ГОРЮЮ!!!!!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
DNK

DNK (статус: Студент), 6 марта 2009, 18:50 [#12]:

В случае натуральных? Учтя замечания из мини-форума возьмите ответ Вадима. Правдо его цикл выведет только максимальный множитель и общее количество. Если вам нужны все берите значения всех "k". Програма min@y™ у меня не пошла. У него как-то слишком сложно, разбираюсь.
"Digital Networked Knight"
I{ () T

I{ () T (статус: Посетитель), 6 марта 2009, 19:12 [#13]:

k := HowManyDiv(i);
а как это понять? то есть как это отразить в delphi?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
DNK

DNK (статус: Студент), 6 марта 2009, 19:32 [#14]:

if k>maxk then begin
maxk := k;
maxn := i;
writeln('Множитель: ' i);
end;
end;
writeln('Количество: ', maxk);

Можно так, я же не знаю к чему код прицеплен в итоге будет.
"Digital Networked Knight"
DNK

DNK (статус: Студент), 6 марта 2009, 19:35 [#15]:

2Вадим Ка: Поправь свой ответ. Пока в рассылку не ушел.
"Digital Networked Knight"
I{ () T

I{ () T (статус: Посетитель), 6 марта 2009, 19:41 [#16]:

uses
SysUtils;
var i,k,n,a,b,maxk,maxn:integer;
begin
readln(a,b);
k :=0;
for i := 2 to n div 2 do
if i mod i = 0 then k:= k+1;
write(k);
for i:=a+1 to b do
begin
k := k+1;
if k>maxk then begin
maxk := k;
maxn := i;
writeln('Множитель', i);
end;
end;
writeln('Количество: ', maxk);
readln;readln;
end.
запускаю...ввожу отрезок...и "виснет" прога...
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
DNK

DNK (статус: Студент), 6 марта 2009, 20:19 [#17]:

Я уверен что она не заработоет. Во всяком сучае правильно.
Попробуйте так.


{$APPTYPE CONSOLE}

uses
SysUtils;
var i,k,a,b,maxk,maxn:integer;

function HowManyDiv(n:integer):integer;
var i,k:integer;
begin
k := 0;
for i := 2 to n div 2 do
if n mod i = 0 then k:= k+1;
result := k;
end;

begin
readln(a,b);

maxn :=a;
maxk := HowManyDiv(maxn);
for i:=a+1 to b do
begin
k := HowManyDiv(i);
if k>maxk then begin
maxk := k;
maxn := i;
end;
end;
writeln('Искомое число:', maxn);
writeln('Количество множителей: ', maxk);
readln;
end.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 7 марта 2009, 09:54 [#18]:

Цитата:


Програма min@y™ у меня не пошла. У него как-то слишком сложно, разбираюсь.


То есть как это? У меня работает, а у тебя нет? Там в архиве ЕХЕ-шник готовый был, ты его запускать пробовал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 7 марта 2009, 11:08 [#19]:

Кому ЕХЕ-шник интересен?

У тебя в 123 строке кусок кода потерян.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 7 марта 2009, 11:20 [#20]:

Вообще странно получилось, действительно, открыл я щас архив, который пришпилил к ответу, а там нету последнео куска. А в исходнике - есть. Вот он:
  // Вывожу ВСЕ числа с максимальным кол-вом делителей
  // вместе со списками этих самых делителей (для визуальной проверки правильности)
  WriteLn(#13#10' --- Values with max count of dividers (total: ', Length(MaxValues), ') ---'#13#10);
 
  for Index:= 0 to Length(MaxValues) - 1 do
    begin
       GetDividers(MaxValues[Index], Dividers);
       OutDividers(Dividers);
    end;
 
 
  ReadLn;
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.