![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
Здравствуйте
дано натуральное число,нужно найти все его делители(тоже натуральные числа) до минимума сократив количество перебираемых чисел. пример: зная что число делится только на 2 и 3 ,например число 36, как сократить перебор,не используя оператор for делителями числа 36 является следующая последовательность цифр 1,2,3,4,6 или посложнее - делителями числа 108 являются 1,2,3,4,6,9 вот кусочек программы readln(x); if (x mod 2=0) and (x mod 3=0) and (x mod 5<>0) and (x mod 7<>0) then begin while trunc(sqrt(x))>=y do begin икс-это натуральное число для которого нужно найти делители(тоже натуральное числа) игрек- это делители числа икс интересует,как можно вывести эти цифры 1,2,3,4,6,9 не прибегая к оператору for так как для больших значений икс время перебора с for значительно увеличится желательно не решать за меня ,а просто указать правильное направление куда думать (если конечно есть такое) |
![]() |
![]() |
![]() |
#2 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
![]()
Конечно можно что-то придумать с массивом, простыми числами, etc..
Но т.к. сегодняшнее машины могут делать опупенное кол-во операций, то,наверное, нам хватит сложности O (Sqrt(n)) Тоесть Код:
Последний раз редактировалось Poma][a; 24.02.2013 в 11:08. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Если число делится только на 2 и 3, это значит, что ни на какие другие числа оно больше не делится, и 2 и 3 и является полным списком его делителей. Но таких числе в природе не существует, т.к. любое число, которое делится на 2 и 3, одновременно делится и на 6.
А случай с числом 36 - вообще интересный: среди его делителей присутствует число 4, т.е. 36 не просто делится на 2, а делится на 2 дважды, что приводит с совершенно другим результатам. Подозреваю, что Вам нужно сначала разложить число на простые делители (для 36 это будет 2,2,3,3 - обратите внимание, что некоторые числа входят более одного раза), а потом просто получить все возможные произведения этих простых делителей (чисто комбинаторная задача). |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 07.02.2013
Сообщений: 267
|
![]()
Бессмысленно. Если применять простые алгоритмы факторизации, типа перебора делителей, то сложность так и останется порядка корня из N. Более сложные алгоритмы вряд ли ему подойдут. Да и весь выигрыш (если таковой будет) от них, убьется получением "всех возможных произведений".
Μολὼν λαβέ
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]()
без цикла - рекурсией
![]()
Не стесняемся, плюсуем!
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Бессмысленно говорить "бессмысленно" до того, как для данной задачи будет определено, в чем именно состоит смысл.
Если под словом "сокращение" подразумевается какая-либо оптимизация, то необходимо сформулировать критерии этой оптимизации. Ну а заодно вычснить, что же требуется получить. Например, для числа 36 делителями являются 12 и 18, о которых ТС почему-то не упоминает. Почему? |
![]() |
![]() |
![]() |
#7 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
![]()
Хм.. интересные дебаты
![]() Код:
![]() А теперь еще полный перебор этих множителей и поиск их произведений.. Если мы и получим оптимизацию, то она будет настолько мала, что для массива в миллион чисел, мы едва почувствуем эту разницу.. Александр, плюсую, ан нет! Не дает ![]() |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
пожалуйста объясните как у Вас получается
писать код именно так аккуратно ,я не нашел никаких тегов чтобы мой код можно было также выделить |
![]() |
![]() |
![]() |
#9 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
![]()
Пишете код, выделяете его и тыкаете кнопочку с #. Или ручками вписываете его в теги [СODE] [/CODE]
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вычислить все числа до n которые равны сумме своих делителей (совершенные числа)//не могу найти ошибку в своей програме на паскале | games_vandal | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 22.12.2012 14:24 |
Исправление программы для нахождения факториала числа | leiprechain | Помощь студентам | 8 | 19.12.2011 20:49 |
TASM - нахождения максимального числа из трех положительных целых чисел и умножения максимального числа | iggor | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 24.05.2009 20:16 |
Составить программу нахождения всех делителей натурального числа N | livestrong | Помощь студентам | 1 | 24.12.2008 20:35 |
Составить программу нахождения всех делителей натурального числа N | livestrong | Помощь студентам | 3 | 24.12.2008 19:02 |