Форум » Обработка числовых последовательностей » 27 - задача 13 : Не могу понять в чём ошибка » Ответить

27 - задача 13 : Не могу понять в чём ошибка

grafit24: Правильный ответ: 30 360137507 Вывод программы: 30 369520943 [pre2] 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)[/pre2] Для начала объясню логику своих рассуждений для лучшего понимания программы(а также возможно в них и кроется ошибка). Когда произведение кратно 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] Мне интересно ,что я упустил в своих рассуждениях никак не могу понять. Буду благодарен ,если кто-нибудь объяснит.

Ответов - 1

grafit24: «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])» Ошибка однозначно находится здесь ,но я не очень понял в чём именно она заключается. Но я вообщем переписал и нашёл способ чуть быстрее и выдающий правильный ответ: [pre2] 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)[/pre2]



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