Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #python 3.6.9
- # Назовём натуральное число подходящим, если у него больше 17 различных делителей (включая единицу и само число).
- # Определите количество подходящих чисел, принадлежащих отрезку [30 001; 70 000], а также наименьшее из таких чисел.
- # В ответе запишите два целых числа: сначала количество, затем наименьшее число.
- # ( https://otvet.mail.ru/question/224587128 )
- # задаём границы интервала, в котором будем искать числа, имеющие больше 17 различных делителей
- lo, hi = 35001, 70000
- # ищем простые числа, котороые могут быть собственными делителями чисел из интересующего нас интервала
- Primes = [0, 0] + list(range(2, round(hi**.5)+1))
- i = 0
- for i in range(2, len(Primes)):
- if Primes[i]:
- for j in range(i*2, len(Primes), i):
- Primes[j] = 0
- Primes = list(filter(lambda x : x, Primes))
- # закончили искать простые числа
- # функция, возвращаюшщая все простые собственные делители заданного числа
- # (использует список простых чисел, найденный на предыдущем этапе)
- def Factorization(N, topLevel = True) :
- result = []
- if N in Primes :
- return result if topLevel else [N]
- for p in Primes:
- if not(N%p) :
- result += [p] + Factorization(N//p, False)
- break
- return [list(filter(lambda y: y==x, result)) for x in set(result)] if topLevel else result
- # функция, подсчитывающая количество различных делителей числа, включая само это число и единицу
- def DivizorsCount(primeDivizors):
- if primeDivizors == []:
- return 2
- result = 1
- for d in primeDivizors:
- result *= len(d) + 1
- return result
- # (вспомогательная функция, инкрементирующая составной счётчик - потребуется в следующей функции)
- def incCounter(counter, counterMax):
- i = 0
- while True:
- counter[i] += 1
- if counter[i] <= counterMax[i]:
- return True
- counter[i] = 0
- i += 1
- if i >= len(counterMax):
- return False
- # функция, возвращающая все различные делители числа, включая само это число и единицу
- def GetDivizors(N, primeDivizors):
- if primeDivizors == []:
- return [1, N]
- counter, counterMax = [0]*len(primeDivizors), [len(d) for d in primeDivizors]
- result = []
- while True:
- divizor = 1
- for i in range(len(counter)):
- divizor *= primeDivizors[i][0]**counter[i]
- result.append(divizor)
- if not(incCounter(counter, counterMax)):
- break
- return result
- # подсчитываем в интересующем нас интервале количество чисел, имеющих больше 17 различных делителей, включая само это число и единицу,
- # а также определяем минимальное из таких чисел
- count, minN = 0, None
- for N in range(lo, hi+1):
- primeDivizors = Factorization(N)
- if DivizorsCount(primeDivizors) > 17:
- count += 1
- if minN is None: minN = (N, primeDivizors)
- # выводим результат
- print(count, minN[0])
- print("делители числа %d:" %(minN[0]), sorted(GetDivizors(*minN)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement