Задание 9 егэ. В чем я не прав? Питон.
Задача выглядит так:
Откройте файл электронной таблицы, содержащей в каждой строке пять натуральных чисел. Определите количество строк таблицы, в которых хотя бы три числа могут образовывать геометрическую прогрессию с отличным от единицы знаменателем прогрессии.
(вот ссылка на файл с сайта КЕГЭ https://kompege.ru/files/GRgpITGVJ.xlsx )
В ответе запишите только число.
Мой код:
schet = 0
for line in open('9.txt'):
a = [int(x) for x in line.split()]
np = [x for x in a if a.count(x) == 1]
np = sorted(np)
if len(np) >= 3:
for k in range(2,max(a)):
if np[0] * k in np:
if (np[0]* k) * k in np:
print(np)
schet += 1
print(schet)
Правильный ответ 56
Мой ответ 164
В чем я не прав?
использовал не тот файл, когда решал, но всё равно мое решение неправильное, не понимаю почему
Три натуральных числа, отсортированных по возрастанию/убыванию, образуют геометрическую прогрессию, если:
np[0] * np[2] == np[1] * np[1]
Если чисел 4, необходимо проверить все 3 комбинации 3 чисел из 4.
Если чисел 5, необходимо проверить все 6 комбинаций 3 чисел из 5.
Проще всего перебирать комбинации с помощью itertools.combinations.
import itertools
schet = 0
for line in open('9.txt'):
np = sorted(set(map(int, line.split())))
if len(np) < 3: continue
schet += any(map(lambda a: a[0] * a[2] == a[1] * a[1], itertools.combinations(np, 3)))
print(schet)
Можешь сам убедиться, что при использовании содержимого твоего файла ответ - именно 56: https://onlinegdb.com/BuS-N62x6
Вариант без any:
import itertools
schet = 0
for line in open('9.txt'):
np = sorted(set(map(int, line.split())))
if len(np) < 3: continue
for a in itertools.combinations(np, 3):
if a[0] * a[2] == a[1] * a[1]:
schet += 1
break
print(schet)
Смотри сюда.
Пусть дана строка
1 -1 1
Это геометрическая прогрессия с первым членом 1 и коэффициентом -1.
Которуй, ЧСХ, отличен от 1.
Но ты отрицательные коэффициенты почему-то не проверяешь совершенно.
И дробные тоже.
И 0 тоже отличен от 1, поэтому прогрессии вроде 3 0 0 ты тоже не найдешь.
И....
В вашем коде есть несколько существенных ошибок:
1. Вы проверяете только случай, когда первое число в отсортированном списке является началом прогрессии. Но прогрессия может начинаться с любого числа в списке.
2. Вы не учитываете случай, когда числа в прогрессии повторяются (например, 2, 2, 4).
3. Вы проверяете только случай, когда все три числа в прогрессии разные.
Вот исправленный вариант кода:
```python
schet = 0
for line in open('9.txt'):
a = [int(x) for x in line.split()]
np = sorted(a)
# Проверяем все возможные тройки чисел
for i in range(len(np)):
for j in range(i+1, len(np)):
for k in range(j+1, len(np)):
# Проверяем, является ли тройка чисел геометрической прогрессией
if np[j]**2 == np[i]*np[k] and np[j] != np[i]:
schet += 1
break
print(schet)
```
Основные изменения:
1. Убрали проверку уникальности чисел
2. Проверяем все возможные тройки чисел
3. Используем математическое условие геометрической прогрессии: b² = a*c
4. Добавляем проверку, что числа не равны (чтобы знаменатель ≠ 1)
Этот код должен дать правильный ответ 56.