Форум » Циклы и ветвления » ПОМОГИТЕ С 22 ЗАДАЧЕЙ!!!! » Ответить

ПОМОГИТЕ С 22 ЗАДАЧЕЙ!!!!

Irina_school64: Очень большой ответ (больше 46 млн), как получить это если не обычным перебором. 210) Ниже записана программа. Получив на вход число x, эта программа печатает числа a и b. При каком наибольшем натуральном значении переменной x программа выведет сначала 90, а потом 37? x = int(input()) a = 3 b = 24 w = 8 while x > 0: d = x % w a *= d if d < 5: b += d x //= w w = 11 - w print(a, b)

Ответов - 8

beep: Это аналитическая задача. Такие задачи не решаются перебором. Нужно набрать a = 90 /3 = 30 произведением, а b = 37 - 24 = 13 - сложением остатка от деления на основание системы счисления, которое меняется по формуле w = 11 - w - из которой следует, что основания чередуются между {3, 8}. Число 30 можно разложить только на 3 * 5 * 2, поскольку a это произведение чисел, то все остальные числа должны быть равны 1. Числа 3 и 5 не могут быть в системе счисления с основанием 3. Получается, что 3 и 5 стоят через одно число, которое есть в СС с основанием 3, число 2 как раз подходит для этого. Получается, что старшие разряды числа выглядят 523.... Теперь, чтобы d = 13, нужно к нему прибавлять все числа, меньшие 5. Получается, что у нас уже есть числа 2 и 3, тогда из единиц нужно набрать 13 - 2 - 3 = 8 единиц. У нас получается 3 + 8 = 11 разрядов. Но если 3 * 2, то мы получим 6. Тогда у нас будет 2 числа (6 и 5), которые больше 5 и счетчик b их не учтет. Тогда нам нужно добрать уже 13 единиц. Получается следующее: 6 1 5 1 1 1 1 1 1 1 1 1 1 1 1 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 Теперь нужно получить десятичное число. Общая идея заключается в том, что целочисленное деление можно представить как k * C + d, где k - целое число, C - основание системы счисления, а d - остаток от деления. Например, чтобы получить десятичное число для числа 615, записанного в СС с плавающим основанием (838), нужно (6 * 3 + 1) * 8 + 5 = 157. Чтобы не ошибиться, пишем простенький код для перевода числа: [pre]s = "615" + ("1" * 12) x = 6 w = 3 for i in range(1, len(s)): d = int(s[ i]) x = x * w + d w = 11 - w print("target", x) #30077946657[/pre] Теперь проверяем получившееся число: [pre] a = 3 b = 24 w = 8 while x > 0: d = x % w number = str(d) + number a *= d if d < 5: b += d x //= w w = 11 - w print("a, b:", a, b) # a, b 90 37[/pre] В итоге правильный ответ 30077946657, а в ответах к заданию указано 46246689, что является ошибкой, потому что получившееся число больше, указанного в ответах (нужно найти максимальное число), а в ответе видимо не учли вариант с 6 и 5 и взяли 5, 3, 2.

Поляков: beep пишет: В итоге правильный ответ 30077946657, а в ответах к заданию указано 46246689, что является ошибкой Спасибо за замечание, условие и ответ исправлены.

Galina22: Например, чтобы получить десятичное число для числа 615, записанного в СС с плавающим основанием (838), нужно (6 * 3 + 1) * 8 + 5 = 157. Подскажите, пожалуйста, почему мы вначале умножаем на 3, ведь сначала степень 8, а потом 3.


Поляков: Galina22 пишет: Например, чтобы получить десятичное число для числа 615, записанного в СС с плавающим основанием (838), нужно (6 * 3 + 1) * 8 + 5 = 157. Подскажите, пожалуйста, почему мы вначале умножаем на 3, ведь сначала степень 8, а потом 3. 157 = x*8 + (157%8) = 19*8 + 5 19 = y*3 + (19%3) = 6*3 + 1 6 = z*8 + (6%8) = 0*8 + 6

Galina22: Понятно, спасибо!

Anna1915: Ниже на трёх языках программирования записана программа. Получив на вход число X, эта программа печатает числа A и B. При каком наибольшем натуральном значении переменной x программа выведет сначала 63, а потом 15? x = int(input()) a = 3 b = 5 w = 9 while x > 0: d = x % w a *= d if d < 5: b += d x //= w w = 17 - w print(a, b) Решение 63/3=21=а 15-5=10=b 21=7*3 получается 73111111111 (меньше 5 десять цифр) 98989898989 73111111111 73=(1*8+0)*9+1 [pre2] s = "73" + ("1" * 9) x = 8 w = 1 for i in range(1, len(s)): d = int(s[ i]) x = x * w + d w = 17 - w print(x) [/pre2] Получаю 11674145, а правильный 198620506 Почему?

Сергей Мохов: x - это первая цифра, w - основание системы счисления

Anna1915: Ниже на трёх языках программирования записана программа. Получив на вход число X, эта программа печатает числа A и B. При каком наибольшем натуральном значении переменной x программа выведет сначала 210, а потом 24? [pre2] x = int(input()) a = 2 b = 14 w = 9 while x > 0: d = x % w a *= d if d < 5: b += d x //= w w = 15 - w print(a, b) [/pre2] решение: а=210/2=105 , 105=7*5*3 24-14=10 9696969696 7531111111 и это число нужно перевести в 10 с.с. 753=(7*6+5)*9+3 Это верное начало?



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