Форум » Массивы, сортировка, работа с файлами » [Р-02] (демо-2021) » Ответить

[Р-02] (демо-2021)

nikitadvu: Всем привет! В самом первом задании из демо(ниже приведено условие),столкнулся с такой проблемой: «Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти два делителя в таблицу на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке таблицы также должны следовать в порядке возрастания.» Приведено такое вот решение из файла,но если изменить в нём диапазон проверяемых чисел (в цитируемой программе они изменены): «from math import sqrt divCount = 2 # нужное количество делителей for n in range(1,21): divs = [] q = round(sqrt(n)) for d in range(2,q): if n % d == 0: divs = divs + [d, n//d] if len(divs) > divCount: break if len(divs) == divCount: print(n,' ', *divs ) #здесь добавил n » то мы увидим вот такой вот список делителей в ответе: 8 [2, 4] 10 [2, 5] 12 [2, 6]здесь 4 делителя (и кстати в списке не хватает 3 и 4) # 2,3,4,6 14 [2, 7] 15 [3, 5] 16 [2, 8] здесь 3 делителя (в списке не хватает 4) # 2,4,8 20 [2, 10]здесь 3 делителя (в списке не хватает 5) # 2,5,10 по условию нам надо найти ровно ДВА РАЗЛИЧНЫХ натуральных делителя,но для малых чисел как видно программа работает неправильно. Для того,чтобы написать программу,её обязательно надо проверить на малом диапазоне и для малых чисел,чтобы убедиться что и для больших чисел программа также будет работать правильно,но здесь как-то не сходиться!? И ещё такой вопрос что правильней применять q = round(sqrt(n)) или q = int(sqrt(n))? Мне кажется что лучше округлять вверх,чем округлять к нулю,не рассмотрев нужное число(хотя ошибок при int не наблюдал).

Ответов - 6

Михаил Титаренко: Во-первых, недостаток в цикле. Он должен идти от 2 до q+1, иначе не захватывается квадратный корень из числа (если он целый). Во-вторых, в данной программе не будет учтено нахождение собственно квадратного корня, нужно добавить условие - если d==n//d, то прибавлять только один делитель. Без разницы, что использовать, round(sqrt(n)) или int(sqrt(n)), поскольку если квадратный корень из числа не целый, то округление в любую сторону все равно не даст лишнего делителя (и не потеряет тоже).

nikitadvu: Сейчас с учётом всех замечаний программа работает при любых числах: from math import sqrt divCount = 2 # нужное количество делителей for n in range(174457, 174505+1): divs = [] q = int(sqrt(n)) for d in range(2,q+1): if n % d == 0: if n//d==d: divs=divs+[d] else: divs = divs + [d,n//d] if len(divs) > divCount: break if len(divs) == divCount: print(*divs ) Т.е. получается в программе из файла Полякова была ошибка,но почему-то никто это не заметил или проигнорировал,раз программа показывает правильный ответ и так сойдёт,так что ли! Что означает * divs?

nikson: nikitadvu пишет: Вопрос:что означает * divs? Это имя переменной, которой присвоен список, если убрать звездочку, то программа напечатает например: [1, 2, 3] А со звездочкой 1 2 3


nikitadvu: Сама * получается просто убирает скобки в списке это равносильно print(' '.join(map(str,divs)))?

Поляков: nikitadvu пишет: получается в программе из файла Полякова была ошибка В текущей версии на сайте ошибки нет. Возможно, она была ранее и была исправлена. Сама * получается просто убирает скобки в списке это равносильно print(' '.join(map(str,divs)))? Да.

nikitadvu: Спасибо всем кто ответил!



полная версия страницы