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

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

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

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



Не зарегистрирован
ссылка на сообщение  Отправлено: 09.06.21 12:22. Заголовок: 27 - задача 13 : Не могу понять в чём ошибка


Правильный ответ: 30 360137507
Вывод программы: 30 369520943
 with open("27-13b.txt") as f: 
raw = f.readlines()
print(raw[0])
data = [int(x) for x in raw[1:]]

def div(a, b):
return a%b==0

count = 0
# индексы элементов делящихся только на 2 и на 7
ids_only2 = []
ids_only7 = []
for i in range(len(data)):
a = data[ i]
# Для всех чисел делящихся на 14 верно следующее утверждение:
# 14*n * k = 14*n*k ,где n, k - любые числа.
if div(a, 14):
i_next = i+7
i_prev = i-6

# считаем все числа справа и слево от числа
count += len(data[i_next:])
if i_prev > 0:
count += len(data[:i_prev])

elif div(a, 2):
ids_only2.append(i)
elif div(a, 7):
ids_only7.append(i)

# Для всех чисел кратных только 7 и 2 верно:
# 7*k * 2*n = 14*k*n ,где k, n - любые числа
for i2 in ids_only2:
i_next = i2+7
i_prev = i2-7

# считаем все числа справа и слева от числа
for i7 in ids_only7:
if i7 >= i_next or i7 <= i_prev:
count += 1

print(count)


Для начала объясню логику своих рассуждений для лучшего понимания программы(а также возможно в них и кроется ошибка).

Когда произведение кратно 14? Ответ в двух случаях ,когда
1) Одно или оба числа делятся на 14.
2) Когда одно число делится на 7 ,а другое на 2.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Допустим i+3<=j ,тогда поймём в скольких произведениях будет участвовать элемент с i=5(то есть число 5).
Говоря о паре (a_i, a_j) ,рассмотрим для представленной последовательности случаи ,когда a_j = 5:
a_i будет равен одному из чисел последовательности [0, 1, 2]
теперь рассмотрим случай a_i = 5:
a_j будет равен одному из чисел последовательности [8, 9, 10]

Из этого маленького примера я сделал вывод ,что можно рассматривать числа как бы с двух сторон
в одном случаи они являются a_i ,а в другом a_j.
[0, 1, 2] 5 [8, 9, 10]

Мне интересно ,что я упустил в своих рассуждениях никак не могу понять. Буду благодарен ,если кто-нибудь объяснит.

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





Сообщение: 1
ссылка на сообщение  Отправлено: 10.06.21 12:38. Заголовок: «if div(a, 14): i_ne..


«if div(a, 14):
i_next = i+7
i_prev = i-6

# считаем все числа справа и слево от числа
count += len(data[i_next:])
if i_prev > 0:
count += len(data[:i_prev])» Ошибка однозначно находится здесь ,но я не очень понял в чём именно она заключается.

Но я вообщем переписал и нашёл способ чуть быстрее и выдающий правильный ответ:
 with open("27-13b.txt") as f: 
raw = f.readlines()
print(raw[0])
data = [int(x) for x in raw[1:]]
N = len(data)

def div(a, b):
return a%b==0

ids_only2 = []
ids_only7 = []
ids_14 = []
for i in range(N):
if div(data[ i], 14):
ids_14.append(i)
elif div(data[ i], 2):
ids_only2.append(i)
elif div(data[ i], 7):
ids_only7.append(i)

count = 0
for i in range(N):
i_next = i+7

if i in ids_14:
numbers_right = N-i_next if N-i_next>0 else 0
count += numbers_right
elif i in ids_only7:
right_2 = len(list(filter(lambda x: x>=i_next, ids_only2)))
right_14 = len(list(filter(lambda x: x>=i_next, ids_14)))
count += right_2 + right_14
elif i in ids_only2:
right_7 = len(list(filter(lambda x: x>=i_next, ids_only7)))
right_14 = len(list(filter(lambda x: x>=i_next, ids_14)))
count += right_7 + right_14
else:
right_14 = len(list(filter(lambda x: x>=i_next, ids_14)))
count += right_14

print(count)


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

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