Форум » Выполнение и анализ алгоритмов для исполнителей » Неверный ответ в задаче 5901 (Е. Джобс) » Ответить

Неверный ответ в задаче 5901 (Е. Джобс)

Ксения Николаевна: Здравствуйте. Решай задачи 5 на сайте Полякова К. В задача 5901 не получается указанного правильным ответа - 227. 227 в двоичной СС - 1110 0011 (по условию слева дописаны три младших разряда, т.е. мы должны были бы увидеть число в котором три первый цифры и три последние одинаковы, а перед тремя первыми стоит единица, иначе незначащие нули бы ушли и единицы слились воедино) Если для числа 11100011 убрать три разряда слева получим 00011, уберем незначащие нули и получим 011 (оставила один ноль, чтобы было три разряда), если вновь проделать 3 шаг, то запись должна иметь вид 110011, что снова противоречит ответу) Мой вариант ответа 247 - в двоичной 1111 0111 - убрав три левых разряда - 10111 - переведем в 10-ю СС - 23 - начальное число 25

Ответов - 8

EugeneJobs: Что мешает добавить незначащий ноль при выполнении указанной в задании операции?

Ксения Николаевна: Поменяется конечное число, чем больше незначащих нулей будем оставлять тем больше оно станет. Вообще в задаче возможен такой исход? Т.е. 11100111 - такой код тоже вполне может получиться? Но тогда я все равно не понимаю как можно прокрутить алгоритм (вручную) наоборот исходя из двоичного кода числа 227 - 1110 0011, ведь три младших разряда 011 (а значит справа мы должны были бы увидеть их), может я что-то не так вообще в сути задачи поняла

GasDM21: "Прикол" в этом задании в том, что минимальный ответ получается не для минимального N. Результаты работы алгоритма "скачут". Вот начало списка результатов: 247 255 227 357 292 422 487 235 300 430 300 430 495 243 308 438 373 503 316 ... Среди них, как видите, есть и 247 и 227. Я решал эту задачу в PascalABC.Net. Вот мое решение: [pre2] uses School; function automat(n: integer): integer; var n2: string; begin n := n - Bin(n).CountOf('0'); n2 := Bin(n); n2 := RightStr(n2, 3) + n2; Result := Dec(n2, 2); end; begin (1..10000).Select(n -> automat(n)) .Where(R -> R > 224) .Min .Print; end. [/pre2]


s11kai: GasDM21 пишет: Результаты работы алгоритма "скачут". Вот начало списка результатов: 247 255 227 357 292 422 487 235 300 430 300 430 495 243 308 438 373 503 316 ... Среди них, как видите, есть и 247 и 227. Когда результаты скачут, это может означать только одно - алгоритм кривой! Вот пример алгоритма, где результат не скачет, а выдает единственно правильный ответ: 227 [pre2] Min = 100000 for i in range(1, 225): n = i - bin(i)[2:].count('0') n2 = bin(n)[2:] if len(n2) >= 3: n2 = n2[-3:] + n2 if int(n2,2) > 224: if int(n2,2) < Min: Min = int(n2,2) print(Min) [/pre2]

GasDM21: И в чем же "кривизна"? Последовательно перебираются числа N, по ним строится R, и они "скачут" то вверх, то вниз.

s11kai: GasDM21 пишет: И в чем же "кривизна"? Последовательно перебираются числа N, по ним строится R, и они "скачут" то вверх, то вниз. Вопрос, конечно, интересный, даже и не знаю как ответить. Начну пожалуй с крылатого выражения Элементарно, GasDM21! Алгоритм дающий однозначный ответ - правильный или "прямой", отсюда следует, что алгоритм не дающий однозначного ответа - неправильный или "кривой" Не нравиться слово «кривой» назовите его "скачущим то вверх, то вниз", т.е. - неуправляемым, а стало быть плохим! А про плохое зеркало как говорят - кривое! Не нравится "кривой", поищите в интернете синонимы для слова "кривой" и выберите любой, я не против Толкование смысла слова кривой Устар. Несправедливый, неправильный, ложный. Вы все правы, один я крив. А. Н. Толстой, Иван Грозный. Порядки-то кривые были при царе. Шолохов, Тихий Дон. синонимы к слову кривой Ничего личного, но предложенный вами алгоритм дает значения, которые с ваших же слов "скачут" то вверх, то вниз, а скачут кто, если перечислять в порядке убывания: Лошади, ..., блохи. Так что определение "кривой", самое толерантное Если я ошибаюсь, поправьте!

s11kai: В дополнение к выше сказанному и с развернутым примером ибо, ... вспомнил еще одно выражение "критикуя, предлагай": GasDM21 пишет: Результаты работы алгоритма "скачут". Вот начало списка результатов: 247 255 227 357 292 422 487 235 300 430 300 430 495 243 308 438 373 503 316 ... стало быть это неправильный или "плохой" алгоритм А вот другой алгоритм, я бы сказал - "Обратный", предложенному выше! Он, как и ваш, последовательно перебирает числа N, и по ним строит числа R, но, в отличии от вашего, выдает единственный и правильный ответ [pre2] Min = set() for N in range(224,1,-1): n = N - bin(N)[2:].count('0') n2 = bin(n)[2:] if len(n2) >= 3: R = int(n2[-3:] + n2,2) if R > 224: Min.add(R) print('Ответ:',min(Min)) [/pre2] Ответил ли я на ваш вопрос и понятен ли мой ответ, уважаемый GasDM21?

s11kai: s11kai пишет: Ответил ли я на ваш вопрос и понятен ли мой ответ, уважаемый GasDM21? Молчание - знак согласия!



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