• Предмет: Информатика
  • Автор: levstarodubcevllllll
  • Вопрос задан 7 лет назад

питон!!! разложить нат. число на простые множители

Ответы

Ответ дал: mirageKZ
1

Ответ:

Python

n = int(input())

slist = []

s = 2

while n > 1:

   if n % s == 0:

       slist.append(s)

       n = n/s

   else:

       s += 1

print(slist)


mirageKZ: slist - переменная список
mirageKZ: в этом списке будут лежать множители
etojan: В 7 строчке ошибка
mirageKZ: etojan, поясни
etojan: Должно быть n = n//s - целочисленное деление. Иначе при достаточно большом числе n получится нецелым из-за погрешности float
mirageKZ: мы туда попадём только если выполнится условие выше n % s == 0
etojan: Да, но float представляет все целые числа без погрешности только до 2^52, на больших числах твой код не будет всегда работать, потому что n при первом же делении станет типа float, а не int
levstarodubcevllllll: а можно решение без списков
etojan: Вот пожалуйста, разложение на множители числа 12345678912345678912 по мнению курильщика: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 11157689, 60029989]
mirageKZ: можно. вместо slist.append(s) написать print(s). А последнюю строчку затереть. Или как предложил etojan.
Ответ дал: etojan
0

num = int(input())

div = 2  # претендент на делитель

while num > 1:

   if num % div == 0:  # остаток от деления равен нулю

       print(div)  # печатаем делитель

       num //= div  # делим исходное число на делитель, чтоб искать дальше

       continue  # проверяем еще раз, будет ли делиться снова на этот же делитель

   if div > num**.5 + 1: # если делитель уже больше, чем корень из n

       print(num) # то единственным таким делителем может быть только само n

       break

   div += 1  # если не делится - увеличиваем возможный делитель


etojan: У меня что-то очень долго считалось то же разложение числа 12345678912345678912, поэтому я добавил короткую схему - простой делитель не может быть больше корня из числа, только если это не само число
etojan: Правильный ответ разложения: 2, 2, 2, 2, 2, 2, 3, 313, 35129, 5847949643
mirageKZ: etojan, разложение на множители числа 12345678912345678912. 2
2
2
2
2
2
3
313
35129
Произведение будет = 2111112384.
mirageKZ: etojan, вы всё слишком усложняете. Вы используете вводимое число типа Int. Не знаю скольки битная у Вас система, но значения это типа Int32: [-2147483648,2147483647]
Int64: [-9223372036854775808,9223372036854775807]. Для чего брать значения выходящие за диапазон данного типа?!
etojan: Уважаемый профессор, в CPython, который является стандартным интерпретатором для языка Python, числа Int имеют максимальную длину размера выделенной для интерпретатора памяти. В некоторых компиляторах, действительно, они могут быть ограничены 32 или 64 битами, но по умолчанию в них подключена длинная арифметика.
etojan: Пожалуйста, запустите хоть раз для сравнения моё решение и ваше, после чего убедитесь в моей правоте и давайте закрывать этот спор. Местные ыксперты всё равно считают ваше решение лучшим
Вас заинтересует