Форум » Обработка целых чисел » Задание 17 № 4319: возможная неоднозначность формулировки » Ответить

Задание 17 № 4319: возможная неоднозначность формулировки

sergurud: Ссылка на задание: https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=4319 Ссылка на скачивание входного файла: https://kpolyakov.spb.ru/cms/files/ege-seq/17-4.txt Входной файл: "17-4.txt", размер: 12000 байт, SHA256: 10D70F8AB1A67FEA15CDE3DB6EE19BAFB5223A4CB869F1C86A27E22F43C641A7 Ответ в задании: 531, 10774 У меня получается другой ответ: 426, 10789. Мой код на Python: [pre2] # считываем числа из файла в список, преобразуем строковые представления чисел в числа f = open('17-4.txt') d = f.readlines() f.close() l = len(d) print('l=', l) for j in range(l): d[j] = int(d[j]) nCount = 0 # обнуляем счетчик найденных чисел с ровно 2-мя делителями из (2, 3, 5, 7) nMin = '' # переменная для нахождения минимального значения из найденных чисел nMax = '' # переменная для нахождения максимального значения из найденных чисел for j in range(l): n = d[j] divCount = 0 # обнуляем счетчик делимости числа n = d[j] на (2, 3, 5, 7) # цикл с условием выхода при неделимости n на (2, 3, 5, 7) while(n % 2 == 0) or (n % 3 == 0) or (n % 5 == 0) or (n % 7 == 0): divCount += 1 # если пройдено условие цикла, то n делится на (2, 3, 5, 7), увеличиваем счетчик if(divCount > 2): break # если n делится более 2 раз, то далее нет смысла в проверке, выходим из цикла # делим n на соотвествующий делитель через else if, чтобы не посчитать один и тот же делитель более одного раза if(n % 2 == 0): n = n // 2 elif(n % 3 == 0): n = n // 3 elif(n % 5 == 0): n = n // 5 elif(n % 7 == 0): n = n // 7 if(divCount == 2): # если d[j] делится на (2, 3, 5, 7) ровно 2 раза, то ... nCount += 1 # увеличиваем счетчик найденных чисел на 1 # если найденное число d[j] меньше минимального, то делаем d[j] минимальным if(nMin == ''): nMin = d[j] elif(nMin > d[j]): nMin = d[j] # если найденное число d[j] больше максимального, то делаем d[j] максимальным if(nMax == ''): nMax = d[j] elif(nMax < d[j]): nMax = d[j] # выводим количество найденных чисел и сумму минимального и максимального из найденных чисел print('nCount=', nCount, 'nMin+nMax=', nMin+nMax) [/pre2] Помогите определить, ошибка в ответе на странице задания или у меня в коде? Спасибо!

Ответов - 2

cabanov.alexey: Представим что число делится на 8. Тогда делимость на 2 посчитается трижды.

sergurud: cabanov.alexey пишет: Представим что число делится на 8. Тогда делимость на 2 посчитается трижды. Действительно, если условием задачи предполагается, что каждый из элементов списка (2, 3, 5, 7) нужно учитывать в качестве делителя не более одного раза, то ответ на странице задания совпадает с полученным мной. Но, по-моему, в этом случае формулировка задания допускает неоднозначность. Основная теорема арифметики говорит нам: «Любое целое число больше 1 может быть разложено в произведение простых чисел, и это разложение единственное с точностью до порядка множителей.» Т.е. любое n из N, n<>1, представимо в виде n = P1*P2*…*Pk, где k из N, Pi – простое число для любого i из N. Так как для любого Pi выполняется равенство q = n/Pi, где q из N, то любое Pi – делитель числа n. Другое дело, что Pi может быть равным Pj для i<>j, и решение о том, являются ли Pi и Pj одним и тем же делителем числа n, так как их значения равны, либо разными делителями, так как оба входят в разложение числа n на множители – это вопрос терминологии. Например, я посчитал их разными делителями. Думаю, что имеет смысл дополнить формулировку задания, например, так: «… Рассматривается множество элементов последовательности, у которых ровно два из его не равных друг другу делителей входят в список (2, 3, 5, 7). …».



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