Что нужно сделать, чтобы выводилось число кратное сгенерированному?

Рейтинг: 1Ответов: 1Опубликовано: 10.07.2023

Есть задание ЕГЭ по информатике, у него одно условие, но разные значения:

Алгоритм получает на вход натуральное число N > 1 и строит по нему новое число R следующим образом: 1.  Строится двоичная запись числа N. 2.  Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется та цифра, которая встречается реже. 3.  Шаг 2 повторяется ещё два раза 4.  Результат переводится в десятичную систему.

Пример. Дано число N  =  19. Алгоритм работает следующим образом: 1.  Двоичная запись числа N: 10011. 2.  В полученной записи нулей меньше, чем единиц, в конец записи добавляется 0. Новая запись: 100110. 3.  В текущей записи нулей и единиц поровну, в конец записывается последняя цифра, это 0. Получается 1001100. В этой записи единиц меньше, в конец добавляется 1: 10011001. 4.  Результат работы алгоритма R  =  153. При каком наименьшем числе N > "x" в результате работы алгоритма получится число, кратное "k"?

Вот мой недоделанный код:

import random

x = random.randint(40, 100)
k = random.randint(2, 5)


print("Алгоритм получает на вход натуральное число N > 1 и строит по нему новое число R следующим образом:")
print("1. Строится двоичная запись числа N.")
print("2. Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется та цифра, которая встречается реже.")
print("3. Шаг 2 повторяется ещё два раза")
print("4. Результат переводится в десятичную систему.")
print("Пример. Дано число N = 19. Алгоритм работает следующим образом:")
print("1. Двоичная запись числа N: 10011.")
print("2. В полученной записи нулей меньше, чем единиц, в конец записи добавляется 0. Новая запись: 100110.")
print("3. В текущей записи нулей и единиц поровну, в конец записывается последняя цифра, это 0. Получается 1001100. В этой записи единиц меньше, в конец добавляется 1: 10011001.")
print("4. Результат работы алгоритма R = 153.")
print("\nПри каком наименьшем числе N > {} в результате работы алгоритма получится число, кратное {}?".format(x, k))

for n in range(x + 1, 1000):
    s = bin(n)[2:]  # перевод в двоичную систему
    zeroes = s.count("0")
    ones = s.count("1")
    if zeroes == ones:
        s += s[-1]
    elif zeroes > ones:
        s += "1"  # добавляем 1 в конец записи, если нулей больше единиц
    else:
        s += "0"  # добавляем 0 в конец записи, если единиц больше нулей
    r = int(s, 2)  # перевод в десятичную систему
    if r % k == 0:
        print(n)
        break

Проблема заключается в том, что при генерации чисел x и k, программа выводит число n, не кратное k, например: При каком наименьшем числе N > 49 в результате работы алгоритма получится число, кратное 4? 50

Что нужно исправить, чтобы генерация была нормальной и вывод был кратный сгенерированному k?

Изменено: Добавил ещё один цикл, совершающий второй шаг трижды(т.к. в 3-м пункте нужно повторить 2-й пункт), но выводит всё равно не кратное число:

import random

x = random.randint(40, 100)
k = random.randint(2, 5)

print("Алгоритм получает на вход натуральное число N > 1 и строит по нему новое число R следующим образом:")
print("1. Строится двоичная запись числа N.")
print("2. Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется та цифра, которая встречается реже.")
print("3. Шаг 2 повторяется ещё два раза")
print("4. Результат переводится в десятичную систему.")
print("Пример. Дано число N = 19. Алгоритм работает следующим образом:")
print("1. Двоичная запись числа N: 10011.")
print("2. В полученной записи нулей меньше, чем единиц, в конец записи добавляется 0. Новая запись: 100110.")
print("3. В текущей записи нулей и единиц поровну, в конец записывается последняя цифра, это 0. Получается 1001100. В этой записи единиц меньше, в конец добавляется 1: 10011001.")
print("4. Результат работы алгоритма R = 153.")
print("\nПри каком наименьшем числе N > {} в результате работы алгоритма получится число, кратное {}?".format(x, k))

def count_digits(s):
    zeroes = s.count("0")
    ones = s.count("1")
    return zeroes, ones

def add_digit(s, digit):
    s += digit
    return s

def binary_to_decimal(s):
    decimal = int(s, 2)
    return decimal

for n in range(x + 1, 1000):
    s = bin(n)[2:]  # перевод в двоичную систему
    
    for _ in range(3):    
        zeroes, ones = count_digits(s)
        
        if zeroes == ones:
            s = add_digit(s, s[-1])
        elif zeroes > ones:
            s = add_digit(s, "1")
        else:
            s = add_digit(s, "0")
    
    r = binary_to_decimal(s)  # перевод в десятичную систему
    if r % k == 0:
        print(n)
        break

Ответы

▲ 2Принят

Ошибка очень простая: в коде пропущен шаг 3. Шаг 2 повторяется только один раз, поэтому программа, естественно, выводит неправильный результат. Добавь еще один цикл. Изменение: Я не знаю, что в твоей новой программе не так, но вот как правильно:

for n in range(105, 1000):
    s = bin(n)[2:] 
    s = str(s)
    for i in range(3):
        if s.count("1") == s.count("0"):
            s += s[-1]
        elif s.count("1") > s.count("0"):
            s += "0"
        else:
            s += "1" 
    r = int(s, 2) 
    if r % k == 0:
        print(n)
        break