Подскажите, что не так?

Есть задание: Рассматривается множество целых чисел, принадлежащих числовому отрезку [3912; 9193], которые удовлетворяют следующим условиям: − сумма цифр числа кратна 9; − шестнадцатеричная запись числа не заканчивается на 21. Найдите количество таких чисел и максимальное из них. Правильный ответ: 585 9189. Скажите, пожалуйста, что не так с кодом?

s = 0
c = 0
for i in range(3912, 9193+1):
    n1 = i
    if (i // 16) % 16 != 21:
        s = 0
        while i != 0:
            s = s + i % 10
            i = i // 10
        if s % 9 == 0:
            c = c + 1
            n = n1
print(c, n)
587 9189

Ответы (3 шт):

Автор решения: Billy

можете попробовать так:

for i in range (3912,9194):
 if sum([int(k) for k in str(i)])%9 == 0 and i%256 == 33:
     print(i)
→ Ссылка
Автор решения: Danis
(i // 16) % 16

замените на

i % 256

и 21 в шестнадцатеричной системе это 33

s = 0
c = 0
for i in range(3912, 9193+1):
    n1 = i
    if i % 256 != 33:
        s = 0
        while i != 0:
            s = s + i % 10
            i = i // 10
        if s % 9 == 0:
            c = c + 1
            n = n1
print(c, n)

также можно уменьшить код если идти с шагом 9

c = 0
for i in range(3912+3, 9193+1, 9):
    if i % 256 != 33:
        c += 1
        n = i
print(c, n)
→ Ссылка
Автор решения: Zhihar

ну можно решить в лоб:

count = 0
found = 0

for i in range(3912, 9193 + 1):
    # определить сумму цифр
    digits = 0

    value = i
    while value != 0:
        digits += value % 10
        value //= 10

    # определить на что заканчивается число в 16ричной записи
    last = i % 256

    # выбрать нужные числа
    if digits % 9 == 0 and last != 33:
        count += 1
        found = i

print(count, found)

если ввести функцию, то можно упростить код, но он все таки не рассчитан на случаи, когда надо найти миллиарды чисел, в этом случае лучше первый вариант:

def digits(value):
    res = 0
    while value != 0:
        res += value % 10
        value //= 10
    return res


data = [i for i in range(3912, 9193 + 1) if i % 256 != 33 and digits(i) % 9 == 0]

print(len(data), data[-1])
→ Ссылка