Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2013, 10:49   #1
ujif
Пользователь
 
Регистрация: 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
значительно увеличится
желательно не решать за меня ,а просто указать правильное направление
куда думать (если конечно есть такое)
ujif вне форума Ответить с цитированием
Старый 24.02.2013, 11:04   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Конечно можно что-то придумать с массивом, простыми числами, etc..
Но т.к. сегодняшнее машины могут делать опупенное кол-во операций, то,наверное, нам хватит сложности O (Sqrt(n))
Тоесть
Код:
var
     n, i : LongInt;

begin
     ReadLn (n);
     
     for i := 1 to Round(Sqrt(n)) do
          if n mod i = 0 then
              WriteLn (i, ' ', n div i)

end.
Вот делители миллиона считаются за 0,02 секунды.. тыц

Последний раз редактировалось Poma][a; 24.02.2013 в 11:08.
Poma][a вне форума Ответить с цитированием
Старый 24.02.2013, 11:30   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от ujif Посмотреть сообщение
пример: зная что число делится только на 2 и 3 ,например число 36,
Если число делится только на 2 и 3, это значит, что ни на какие другие числа оно больше не делится, и 2 и 3 и является полным списком его делителей. Но таких числе в природе не существует, т.к. любое число, которое делится на 2 и 3, одновременно делится и на 6.
А случай с числом 36 - вообще интересный: среди его делителей присутствует число 4, т.е. 36 не просто делится на 2, а делится на 2 дважды, что приводит с совершенно другим результатам.

Подозреваю, что Вам нужно сначала разложить число на простые делители (для 36 это будет 2,2,3,3 - обратите внимание, что некоторые числа входят более одного раза), а потом просто получить все возможные произведения этих простых делителей (чисто комбинаторная задача).
s-andriano вне форума Ответить с цитированием
Старый 24.02.2013, 12:59   #4
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Подозреваю, что Вам нужно сначала разложить число на простые делители (для 36 это будет 2,2,3,3 - обратите внимание, что некоторые числа входят более одного раза), а потом просто получить все возможные произведения этих простых делителей (чисто комбинаторная задача).
Бессмысленно. Если применять простые алгоритмы факторизации, типа перебора делителей, то сложность так и останется порядка корня из N. Более сложные алгоритмы вряд ли ему подойдут. Да и весь выигрыш (если таковой будет) от них, убьется получением "всех возможных произведений".
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 24.02.2013, 14:32   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

без цикла - рекурсией
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 24.02.2013, 15:33   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от alexander13 Посмотреть сообщение
Бессмысленно.
Бессмысленно говорить "бессмысленно" до того, как для данной задачи будет определено, в чем именно состоит смысл.
Если под словом "сокращение" подразумевается какая-либо оптимизация, то необходимо сформулировать критерии этой оптимизации.
Ну а заодно вычснить, что же требуется получить.
Например, для числа 36 делителями являются 12 и 18, о которых ТС почему-то не упоминает. Почему?
s-andriano вне форума Ответить с цитированием
Старый 24.02.2013, 15:55   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Хм.. интересные дебаты
Код:
var
        i, n : Integer;

begin
        ReadLn (n);

        i := 2;

        while n >= i do
                if n mod i <> 0 then
                        Inc(i)
                else begin
                        Write (i, ' ');
                        while n mod i = 0 do
                                n := n div i
                end
end.
Вот есть алгоритм разложения на множетели, его сложность :

А теперь еще полный перебор этих множителей и поиск их произведений.. Если мы и получим оптимизацию, то она будет настолько мала, что для массива в миллион чисел, мы едва почувствуем эту разницу..

Александр, плюсую, ан нет! Не дает
Poma][a вне форума Ответить с цитированием
Старый 13.06.2013, 19:39   #8
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

пожалуйста объясните как у Вас получается
писать код именно так аккуратно ,я не нашел никаких
тегов чтобы мой код можно было также выделить
ujif вне форума Ответить с цитированием
Старый 13.06.2013, 20:33   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Пишете код, выделяете его и тыкаете кнопочку с #. Или ручками вписываете его в теги [СODE] [/CODE]
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычислить все числа до 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