На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение





Сообщение: 1
ссылка на сообщение  Отправлено: 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 не наблюдал).

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 6 [только новые]





Сообщение: 3
ссылка на сообщение  Отправлено: 17.03.21 14:39. Заголовок: Во-первых, недостато..


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 3
ссылка на сообщение  Отправлено: 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?

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 126
ссылка на сообщение  Отправлено: 17.03.21 15:38. Заголовок: nikitadvu пишет: Во..


nikitadvu пишет:

 цитата:
Вопрос:что означает * divs?


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 4
ссылка на сообщение  Отправлено: 17.03.21 15:43. Заголовок: Сама *получается про..


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 2583
ссылка на сообщение  Отправлено: 17.03.21 20:03. Заголовок: nikitadvu пишет: пол..


nikitadvu пишет:
 цитата:
получается в программе из файла Полякова была ошибка

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

Да.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 5
ссылка на сообщение  Отправлено: 17.03.21 23:45. Заголовок: Спасибо всем кто отв..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 529
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет