Форум » Выполнение и анализ алгоритмов для исполнителей » ege 5 задача 302 » Ответить

ege 5 задача 302

s11kai: 302) (А. Игнатюк) Исполнитель «Аполлон» получает на вход четырёхзначное число N и строит новое число R по следующим правилам: 1. Если число N начинается с чётной цифры, то число R вычисляется как сумма первой и третьей цифр и модуля разности второй и четвёртой цифр. 2. Если число N начинается с нечётной цифры, то цифры числа N располагают в неубывающем порядке. Число R вычисляется как сумма цифр в двоичной записи полученного числа. Сколько существует чисел N, для которых результат работы алгоритма будет более 20? Предложенное решение [pre2] def alg( n ): s = str(n) if (n // 1000) % 2 == 0: R = int(s[0]) + int(s[2]) + abs(int(s[1]) - int(s[3])) else: s = ''.join(sorted(s)) b = f"{int(s):b}" R = sum( int(d) for d in b ) return R count = 0 for i in range(1000, 10000): if alg(i) > 20: count += 1 print( count ) [/pre2] с одной стороны слишком длинновато, когда дорога каждая минута. С другой стороны,у нас же не конкурс программистов по написанию программ, соответствующих заданному алгоритму,стало быть, можно включать голову, если она есть...! Вопрос: "Сколько существует чисел N, для которых результат работы алгоритма будет более 20?" Причем пункт 2) гласит - "Если число N начинается с нечётной цифры, то цифры числа N располагают в неубывающем порядке. Число R вычисляется как сумма цифр в двоичной записи полученного числа." У кого есть желание, конечно, пусть ломают голову над тем как расположить числа в неубывающем порядке, а затем еще и искать сумму единиц в двоичном коде для каждого числа. А мы знаем, что 2 в 20 степени = 1 048 576, а кто не знает легко проверить командой print(2**20) Но в условии оговорено, что числа должны быть четырехзначные, стало быть пункт 2) вне нашего диапазона, откуда следует, что решение может быть примерно таким: [pre2] k = 0 for i in range(2000,10000): if (i//1000)%2 == 0: if i//1000 + (i//10)%10 + abs((i//100)%10 - i%10) > 20: k += 1 print(k) [/pre2]

Ответов - 1

s11kai: или таким [pre2] k = 0 for i in range(2000,10000): if (i//1000)%2 == 0 and i//1000 + (i//10)%10 + abs((i//100)%10 - i%10) > 20: k += 1 print(k) [/pre2]



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