Задать вопрос
@rihoplya
Собираюсь поступать в ВУЗ

Не могу решить задание из ЕГЭ. Опечатка?

Вот задание:

Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом:
1.  Строится двоичная запись числа N.
2.  Подсчитывается количество чётных и нечётных цифр в десятичной записи заданного числа. Если в десятичной записи больше чётных цифр, то в конец двоичной записи дописывается 1, если нечётных  — 0. Если чётных и нечётных цифр в десятичной записи поровну, то в конец двоичной записи дописывается 0, если данное число чётное, и 1  — если нечётное.
3−4.  Пункт 2 повторяется для вновь полученных чисел ещё два раза.
5.  Результатом работы алгоритма становится десятичная запись полученного числа R.
Определите количество принадлежащих отрезку [876 544; 1 234 567 899] чисел, которые могут получиться в результате работы этого алгоритма.

Вот мой код:

chet = [] 
nechet = []
N = int(input())
N1=list(map(int, str(N)))
for i in N1: 
    if i%2==0: chet.append(i) 
    if i%2!=0: nechet.append(i) 

for i in range(3):
    if (len(chet) < len(nechet)) or ((len(chet) == len(nechet)) and (N%2==0)): N= N*2
    elif len(chet) > len(nechet) or ((len(chet) == len(nechet)) and (N%2!=0)): N = N*2 + 1

print(N)

Но выводятся не те числа, то есть введу 14, а выходит итог 112... Есть подобное задание на форуме и объяснение мне помогло, но к правильному ответу все равно не пришла.
  • Вопрос задан
  • 2301 просмотр
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@99insania99
Считать четные и нечетные надо на каждой итерации цикла "дописывания". Что-то типа такого
примерный код
N = int(input())

for _ in range(3):
        chet = 0
	nechet = 0
	for i in str(N):
		if int(i) % 2:
			nechet += 1
		else: 
			chet += 1

	if chet > nechet:
		N = N << 1 + 1
	elif chet < nechet:
		N = N << 1
	elif N % 2:
		N = N << 1 + 1
	else:
		N = N << 1

print(N)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@PerfectRayStudio
Мне кажется тут не нужен ввод с консоли вообще. Иначе,
Условие
Определите количество принадлежащих отрезку [876 544; 1 234 567 899] чисел, которые могут получиться в результате работы этого алгоритма.
не имеет здесь никакого смысла.
Я понимаю это задание, как перебор неких чисел N в каком-либо диапазоне (например до 2^24). Выполнение алгоритма и счёт кол-ва чисел N, при которых они будут принадлежать отрезку R.

Не python, но скину свой код на C#:
HashSet<int> RValues = new HashSet<int>();

int maxN = 1 << 24;

for (int N = 1; N <= maxN; N++)
{
    string binary = Convert.ToString(N, 2);
    int currentN = N;

    for (int i = 0; i < 3; i++)
    {
        int chet = 0;
        int nechet = 0;
        foreach (char c in currentN.ToString())
        {
            int dec = c - '0';
            if (dec % 2 == 0)
                chet++;
            else
                nechet++;
        }
        if (chet > nechet)
            binary += '1';
        else if (nechet > chet)
            binary += '0';
        else
            binary += (currentN % 2 == 0) ? '0' : '1';

        currentN = Convert.ToInt32(binary, 2);
    }
    int R = currentN;
    if (R >= 876_544 && R <= 1_234_567_899)
        RValues.Add(R);
}
Console.WriteLine($"Количество чисел R: {RValues.Count}");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы