Форум » Обработка целых чисел » № 6295 » Ответить

№ 6295

gg: Текст задачи: (№ 6295) В файле 17-354.txt содержится последовательность целых чисел, по модулю не превышающих 10000. Определите количество пар элементов последовательности, для которых выполняются следующие условия: – последняя цифра записи одного из элементов пары совпадает с предпоследней цифрой записи другого элемента; – ровно один элемент из пары делится без остатка на 11; – сумма квадратов элементов пары не меньше квадрата среднего арифметического всех элементов последовательности, две последние цифры в записи которых одинаковы. В ответе запишите два числа: сначала количество найденных пар, затем максимальную величину суммы квадратов элементов этих пар. Мне не понятна формулировка задания, но вот мой вариант решения(неверный): [pre2] f = open('17-354.txt') k = [str(i).strip() for i in f] s = [] for i in range(len(k)): if k[0][ ::-1 ][ :2 ] == k[ i ][ ::-1 ][ :2 ]: s.append(int(k[ i ])) n, p, m = (sum(s)/len(s))**2, 0, 0 for i in range(len(k)-1): sum_kv = (int(k[ i ])**2) + (int(k[ i+1 ])**2) if sum_kv >= n: if (k[ i ][ -1 ] == k[ i+1 ][ -1 ]) and (((int(k[ i ])%11 == 0) and (int(k[ i+1 ])%11 != 0)) or ((int(k[ i+1 ])%11 == 0) and (int(k[ i ])%11 != 0))): p += 1 m = max(m, sum_kv) print(p, m) [/pre2] Не сходится ответ. Помогите найти ошибку.

Ответов - 4

Поляков: gg пишет: Мне не понятна формулировка задания Что именно непонятно?

Ж: Возможно, ошибка в том, что последние 2 цифры есть не у всех чисел, а лишь у тех, что по модулю больше 9. [pre2] f=open('c:/17-354.txt') s=[int(c) for c in f.readlines()] a=[c for c in s if abs(c)>9 and str(c)[-1]==str(c)[-2]] sr=(sum(a)/len(a))**2 def g(a,b): return abs(b)>9 and str(a)[-1]==str(b)[-2] or abs(a)>9 and str(a)[-2]==str(b)[-1] pa=[(s**2+s[i+1]**2) for i in range(len(s)-1) if ((s%11==0) + (s[i+1]%11==0))==1 and g(s,s[i+1]) and (s**2+s[i+1]**2)>=sr ] print(len(pa), max(pa)) [/pre2]

Дьякова Катерина: Ж пишет: f=open('c:/17-354.txt') s=[int(c) for c in f.readlines()] a=[c for c in s if abs(c)>9 and str(c)[-1]==str(c)[-2]] sr=(sum(a)/len(a))**2 def g(a,b): return abs(b)>9 and str(a)[-1]==str(b)[-2] or abs(a)>9 and str(a)[-2]==str(b)[-1] pa=[(s**2+s[i+1]**2) for i in range(len(s)-1) if ((s%11==0) + (s[i+1]%11==0))==1 and g(s,s[i+1]) and (s**2+s[i+1]**2)>=sr ] print(len(pa), max(pa)) Для начала ваш код не работает, но это легко поправить: [pre2] f=open('17-354.txt') s=[int(c) for c in f.readlines()] a=[c for c in s if abs(c)>9 and str(c)[-1]==str(c)[-2]] sr=(sum(a)/len(a))**2 def g(a,b): #return abs(b)>9 and str(a)[-1]==str(b)[-2] or abs(a)>9 and str(a)[-2]==str(b)[-1] return str(a)[-1]==str(b)[-2] or str(a)[-2]==str(b)[-1] pa=[(s**2+s[i+1]**2) for i in range(len(s)-1) if ((s%11==0) + (s[i+1]%11==0))==1 and g(s,s[i+1]) and (s**2+s[i+1]**2)>=sr ] print(len(pa), max(pa)) [/pre2] Проблем с числами, состоящими из одного разряда (<9) не существует в этом документе, т.к. все числа состоят не менее чем из трех разрядов. Но я не понимаю почему этот код дает правильный ответ. Вот какие я вижу неточности: 1) В задаче сказанно "Определите количество пар элементов последовательности", в задаче нет фраз вида: "Назовём парой два идущих подряд элемента последовательности.", значит парами можно считать два ЛЮБЫХ числа, из этой последовательности, подходящих под прочие условия. Код с верным ответом предполагает, что числа расположенны подряд друг за другом. 2) В тексте задания сказанно: "– сумма квадратов элементов пары не меньше квадрата среднего арифметического всех элементов последовательности, две последние цифры в записи которых одинаковы." Какие две последние цифры одинаковы? В записи чего? Две последних цифры в сумме квадратов элементов пары и квадрата среднего арифметического всех элементов последовательности? нет, это дает ответ 0; Может две последних цифры квадратов элементов пары? Это дает ненулевой ответ, вот только он не правильный. Последние две цифры элементов пары? Тоже ненулевой ответ, тоже не правильный. А правильный дает код выше, вот только он сравнивает два последних разряда в числах пары зеркально: "str(a)[-1]==str(b)[-2] or str(a)[-2]==str(b)[-1] " (где a и b - числа одной пары). Я не понимаю почему нужно использовать сравнение зеркально, на это ничего не указывает в тексте задачи. Возможно, задача имеет две некорректные формулировки и их стоит поправить. Я прочла эту задачу так: пары нужно собирать из всех чисел; две последние цифры в записи одного числа пары равны двум последним цифрам в записи второго числа пары. Код для такого прочтения: [pre2] f = open('17-354.txt', 'r') data = f.readlines() f.close() summ=0 c=0 maxi = 0 for i in range(len(data)): data = int(data) summ += data sr=(summ/len(data))**2 for i in range(len(data)): for j in range(i, len(data)): if int(str(data)[-1]) == int(str(data[j])[-1]): if ((data%11==0) and (data[j]%11!=0)) or ((data[j]%11==0) and (data%11!=0)): if (data**2+data[j]**2)>=sr and (data%100 == data[j]%100): c+=1 maxi=max(maxi, (int(data)**2+int(data[j])**2)) print(c, maxi) [/pre2] Ответ: 12450 195209282


Ж: 1) Код не работал, т.к. я постоянно забываю, что [ i] воспринимается как редактирования текста курсивом и и кода удаляется. Поправила код и добавила комментарии. 2) И я согласна, что надо бы поправить условие и дописать, что подразумевается под парами. 3) в файле есть однозначные числа (как отрицательные, так и положительные) 4) С этим не согласна, Я прочла эту задачу так: пары нужно собирать из всех чисел; две последние цифры в записи одного числа пары равны двум последним цифрам в записи второго числа пары. т.к. есть первое условие, которое накладывается именно на пары:последняя цифра записи одного из элементов пары совпадает с предпоследней цифрой записи другого элемента; 5) с этим тоже не согласна, т.к есть третье условие, которое мне кажется однозначным. Во всяком случае, я его иначе прочитать не могу сумма квадратов элементов пары не меньше квадрата среднего арифметического всех элементов последовательности, две последние цифры в записи которых одинаковы. [pre2]f=open('d:/17-354.txt') s=[int(c) for c in f.readlines()] #а - список элементов последовательности, две последние цифры в записи которых одинаковы. a=[c for c in s if abs(c)>9 and str(c)[-1]==str(c)[-2]] # sr - квадрат среднего арифметического всех элементов последовательности, две последние цифры в записи которых одинаковы. sr=(sum(a)/len(a))**2 # Функция g обрабатывает пару чисел и возвращает истинность условия: последняя цифра записи одного из элементов пары совпадает с предпоследней цифрой записи другого элемента; def g(a,b): return abs(b)>9 and str(a)[-1]==str(b)[-2] or abs(a)>9 and str(a)[-2]==str(b)[-1] #рa - список пар соседних элементов, которые удовлетворяют всем условиям pa=[(s[j]**2+s[j+1]**2) for j in range(len(s)-1) if ((s[j]%11==0) + (s[j+1]%11==0))==1 and g(s[j],s[j+1]) and (s[j]**2+s[j+1]**2)>=sr ] print(len(pa), max(pa)) [/pre2] А вот код, который работает для любых пар , не обязательно соседних [pre2] f=open('d:/17-354.txt') s=[int(c) for c in f.readlines()] #а - список элементов последовательности, две последние цифры в записи которых одинаковы. a=[c for c in s if abs(c)>9 and str(c)[-1]==str(c)[-2]] # sr - квадрат среднего арифметического всех элементов последовательности, две последние цифры в записи которых одинаковы. sr=(sum(a)/len(a))**2 # Функция g обрабатывает пару чисел и возвращает истинность условия: последняя цифра записи одного из элементов пары совпадает с предпоследней цифрой записи другого элемента; def g(a,b): return abs(b)>9 and str(a)[-1]==str(b)[-2] or abs(a)>9 and str(a)[-2]==str(b)[-1] #рa - список пар элементов, которые удовлетворяют всем условиям pa=[] for k in range(len(s)-1): for n in range(k+1,len(s)): if ((s[k] % 11 == 0) + (s[n] % 11 == 0)) == 1 and g(s[k], s[n]) and (s[k] ** 2 + s[n] ** 2) >= sr: pa.append(s[k]**2+s[n]**2) print(len(pa), max(pa)) [/pre2]



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