Top.Mail.Ru
Ответы

Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом:

1.  Строится двоичная запись числа N.
2.  Если число N делится на 5, в конец двоичной записи добавляется двоичный код числа 5, в противном случае в конец двоичной записи добавляется 1.
3.  Если полученное на предыдущем шаге число делится на 7, в конец двоичной записи добавляется двоичный код числа 7, в противном случае в конец двоичной записи добавляется 1.
4.  Результатом работы алгоритма становится десятичная запись полученного числа R.

Пример. Дано число N  =  10. Алгоритм работает следующим образом:
1.  Строим двоичную запись: 1010  =  10102.
2.  Число 10 делится на 5, добавляем к двоичной записи код числа 5, получаем 10101012  =  8510.
3.  Число 85 не делится на 7, добавляем к двоичной записи цифру 1. Получаем 101010112  =  17110.
4.  Результат работы алгоритма R  =  171.

Определите наибольшее возможное значение N, для которого в результате работы алгоритма получается R <  1 855 663.

По дате
По рейтингу
Аватар пользователя
Новичок

Приписать к 1 справа к X означает: X * 2 + 1, всегда нечётное.
В обратную сторону: (Y - 1) / 2
N будет максимальным, если N не делится на 5 и 2 * N + 1 не делится на 7.

Берём максимальное нечётное число < 1 855 663 и начинаем двигаться вниз.
(1855661 - 1) / 2 = 927830 - не подходит, т.к. чётное.
(1855659 - 1) / 2 = 927829 - не подходит, т.к. делится на 7
1855657 сразу пропускаем, т.к. будет чётное
(1855655 - 1) / 2 = 927827 - подходит, т.к. нечётное и не делится на 7
(927827 - 1) / 2 = 463913 - подходит, т.к. не делится на 5.

Ответ: 463913
БЕЗ программирования.

Аватар пользователя
Искусственный Интеллект

С побитовыми, без явного перевода в строку бит:

12345678
 mR=1855 
for R0 in range(1855,1855663):
    R=R0 
    for k in (5,7): 
        if R%k: R=(R <<1)|1 
        else: R=(R <<3)|k 
    if R<1855663: mR=max(mR,R0) 
print(mR) 

рез:=463913 , ч.т.д!

Аватар пользователя
Просветленный
123456789101112131415161718192021222324252627282930313233343536373839404142
 def find_max_n(limit): 
    def get_binary(n): 
        return bin(n)[2:] 
 
    def append_based_on_condition(n, condition, value_if_true, value_if_false): 
        if condition: 
            return n + bin(value_if_true)[2:] 
        else: 
            return n + bin(value_if_false)[2:] 
 
    def algorithm(N): 
        # Step 1: Binary representation of N 
        binary_rep = get_binary(N) 
 
        # Step 2: Append based on divisibility by 5 
        binary_rep = append_based_on_condition(binary_rep, N % 5 == 0, 5, 1) 
 
        # Step 3: Convert to decimal to check divisibility by 7 
        decimal_value = int(binary_rep, 2) 
 
        # Append based on divisibility by 7 
        binary_rep = append_based_on_condition(binary_rep, decimal_value % 7 == 0, 7, 1) 
 
        # Convert final binary representation to decimal 
        R = int(binary_rep, 2) 
 
        return R 
 
    max_n = 0 
    for N in range(1, limit): 
        R = algorithm(N) 
        if R < 1855663: 
            max_n = N 
        else: 
            break 
 
    return max_n 
 
limit = 1000000  # Start with a reasonably large limit for the search 
max_n = find_max_n(limit) 
print("Наибольшее возможное значение N:", max_n)