|
Вопрос # 2 483/ вопрос решён / |
|
Здравствуйте, эксперты!
возник такой вопрос: нужно найти число, находящееся на отрезке [ a, b ], имеющее наибольшее количество делителей? Помогите ПОЖАЛУЙСТА!!!!
 |
Вопрос задал: 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 (статус: Посетитель), 4 марта 2009, 19:04 [#2]:
увы нет. такое к сожалению еще не прошел.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 4 марта 2009, 20:16 [#3]:
извините, я только учусь на delphi поэтому не могли бы разъяснить, как понять HowManyDiv, как его в программе писать, то бишь чем заменить?
P.S.на счет циклов ошибка вышла. не разглядел сразу.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 4 марта 2009, 20:29 [#4]:
так...а можно ведь как то условие поставить чтобы выводило те числа, у которых количество делителей одинаково?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
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 (статус: Студент), 5 марта 2009, 17:02 [#6]:
А делители любые? Или натуральными должны быть.
"Digital Networked Knight"
|
|
Вадим К (статус: Академик), 5 марта 2009, 17:10 [#7]:
Для не натуральных (для не целых, если быть точным) данная задача лишена смысла.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Студент), 6 марта 2009, 18:23 [#10]:
2 Вадим К: Так как по жизни везёт, всегда ищю приключений.
2 I{ () T: По поводу множителей жду твоих уточнений.
"Digital Networked Knight"
|
|
I{ () T (статус: Посетитель), 6 марта 2009, 18:31 [#11]:
делители натуральные конечно! пожалуйста, если не сложно напиши мне эту программу(((( ГОРЮЮ!!!!!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
DNK (статус: Студент), 6 марта 2009, 18:50 [#12]:
В случае натуральных? Учтя замечания из мини-форума возьмите ответ Вадима. Правдо его цикл выведет только максимальный множитель и общее количество. Если вам нужны все берите значения всех "k". Програма min@y™ у меня не пошла. У него как-то слишком сложно, разбираюсь.
"Digital Networked Knight"
|
|
I{ () T (статус: Посетитель), 6 марта 2009, 19:12 [#13]:
k := HowManyDiv(i);
а как это понять? то есть как это отразить в delphi?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
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 (статус: Студент), 6 марта 2009, 19:35 [#15]:
2Вадим Ка: Поправь свой ответ. Пока в рассылку не ушел.
"Digital Networked Knight"
|
|
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 (статус: Студент), 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™ (статус: Доктор наук), 7 марта 2009, 09:54 [#18]:
Цитата:
Програма min@y™ у меня не пошла. У него как-то слишком сложно, разбираюсь.
То есть как это? У меня работает, а у тебя нет? Там в архиве ЕХЕ-шник готовый был, ты его запускать пробовал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 7 марта 2009, 11:08 [#19]:
Кому ЕХЕ-шник интересен?
У тебя в 123 строке кусок кода потерян.
"Digital Networked Knight"
|
|
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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|