Автор | Сообщение |
|
Отправлено: 17.03.21 14:09. Заголовок: [Р-02] (демо-2021)
Всем привет! В самом первом задании из демо(ниже приведено условие),столкнулся с такой проблемой: «Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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
[только новые]
|
|
|
Отправлено: 17.03.21 14:39. Заголовок: Во-первых, недостато..
Во-первых, недостаток в цикле. Он должен идти от 2 до q+1, иначе не захватывается квадратный корень из числа (если он целый). Во-вторых, в данной программе не будет учтено нахождение собственно квадратного корня, нужно добавить условие - если d==n//d, то прибавлять только один делитель. Без разницы, что использовать, round(sqrt(n)) или int(sqrt(n)), поскольку если квадратный корень из числа не целый, то округление в любую сторону все равно не даст лишнего делителя (и не потеряет тоже).
|
|
|
|
Отправлено: 17.03.21 15:30. Заголовок: Сейчас с учётом всех..
Сейчас с учётом всех замечаний программа работает при любых числах: 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?
|
|
|
|
Отправлено: 17.03.21 15:38. Заголовок: nikitadvu пишет: Во..
nikitadvu пишет: цитата: | Вопрос:что означает * divs? |
| Это имя переменной, которой присвоен список, если убрать звездочку, то программа напечатает например: [1, 2, 3] А со звездочкой 1 2 3
|
|
|
|
Отправлено: 17.03.21 15:43. Заголовок: Сама *получается про..
Сама * получается просто убирает скобки в списке это равносильно print(' '.join(map(str,divs)))?
|
|
|
|
| Администратор
|
Сообщение: 2583
|
|
Отправлено: 17.03.21 20:03. Заголовок: nikitadvu пишет: пол..
nikitadvu пишет: цитата: | получается в программе из файла Полякова была ошибка |
|
В текущей версии на сайте ошибки нет. Возможно, она была ранее и была исправлена. цитата: | Сама * получается просто убирает скобки в списке это равносильно print(' '.join(map(str,divs)))? |
|
Да.
|
|
|
|
Отправлено: 17.03.21 23:45. Заголовок: Спасибо всем кто отв..
Спасибо всем кто ответил!
|
|
|
|