Вывод числа состоящего только из четных цифр Python

Рейтинг: 2Ответов: 10Опубликовано: 26.02.2023

Обучаюсь на начальном этапе Python, не знаю как подойти к решению такой задачи:

Выведите на экран все числа в интервале от 100 до 400 включительно, каждое из которых состоит только из четных цифр (например 200, 260, 282 и т.д.).

Делаю список цифр от 100 до 400, но дальше как вывести именно только значения, состоящие из четных цифр не знаю..

a = list(range(100, 400))
i = 0
while i < len(a):
    b = a[i]
    i += 1
print(a)

Подскажите, пожалуйста, что делать дальше, желательно максимально доступно)

Ответы

▲ 6

Как вариант

for num in range(100, 401):
    if all(int(digit) % 2 == 0 for digit in str(num)):
        print(num)
▲ 4

Решение через множества. Создаем множество четных цифр, каждое число раскладываем на цифры и проверяем, является ли множество четных цифр надмножеством для цифр этого числа.

chet = set('02468')
for num in range(100,401):
    if chet.issuperset(str(num)):
        print(num)

Вариант без множеств и преобразования в строку. Разбираем в цикле каждое число из диапазона, проверяя остаток от деления на 2 и на каждой итерации деля на 10, чтобы проверить следующую цифру. Если находим нечетное число, происходит досрочный выход из while и ничего не печатается. Если цикл отработал полностью (выхода по break не было), срабатывает else: и число печатается.

for num in range(100, 401):
    x = num
    while x > 0:
        if x % 2 != 0:
            break
        x //= 10
    else:
        print(num)
200
202
204
...
286
288
400
▲ 4

Зачем вообще проходить, проверять и отсеивать неподходящие числа? Просто работаем в пятеричной системе.

for i in range(25,51):
    print(i//25*2,i//5%5*2,i%5*2,sep='')

Допустимые цифры 0,2,4,6,8 можно рассматривать как удвоенные 0,1,2,3,4. А такой (и не более!) набор цифр соответствует пятеричной системе счисления. В этой системе диапазон пятеричных чисел будет непрерывным 100,101,102,103,104,110,111...144,200 (а в десятичном виде это 25..50). Просто перебираем их подряд, и каждую цифру (выделяемую с помощью целочисленного деления и взятия остатка) этих пятеричных чисел при выводе умножаем на 2.

▲ 1
for i in range(100, 401):
   if (i % 10) % 2 == 0 and ((i // 10) % 10) % 2 == 0 and (i // 100) % 2 == 0:
        print(i)

Вывод:

200 202 204 206 208 220 222 224 226 228 240 242 244 246 248 260 262 264 266 268 280 282 284 286 288 400

Если 4 % 2 = 0 остаток от деления равен 0, число четное.

Разделить разряды числа можно следующим образом, число 123:

123 % 10 = 3 т.е. Последнее число
(123 // 10) % 10 = 2 Среднее число
123 // 100 = 1 первое число.

Каждое число проверяем на четность если все четные, записываем.

▲ 1

Получилось как-то так:

for i in range(100, 401):
     var1, var2,var3 = str(i)[0], str(i)[1], str(i)[2]
     if int(var1) % 2 == 0 and int(var2) % 2 == 0 and int(var3) % 2 == 0:
          print(f'{var1 + var2 + var3}')
▲ 1

tio.run

for x in range(200, 1000, 200):
  for y in range(x, x+100, 20):
    for z in range(y, y+10, 2):
      print(z)

Тьфу, до 400, а не до 1000. Тогда так: tio.run

lim = 401

for x in range(200, min(lim, 1000), 200):
  for y in range(x, min(lim, x+100), 20):
    for z in range(y, min(lim, y+10), 2):
      print(z)
▲ 0

В строчке

i += 1

1 поменяй на 2, но это конкретно в этом контексте, так оно просто отобразит числа через одно, то есть 100, 102, 104, и так далее, пропуская при этом 101, 103, и т.д.

▲ 0

Для while вот вариант решения.
Создайте a как пустой список и в цикле while методом append заполните его:


a = []
b = 100
n = 400
i = 0

while i <= n - b:
    elem = b + i
    if (elem % 10) % 2 == 0 and ((elem // 10) % 10) % 2 == 0 and (elem // 100) % 2 == 0:
        a.append(elem)
    i += 2
print(a)

▲ 0
evens = "0 2 4 6 8".split()

for i in range(200, 401, 2):
    hundreds, tens, ones = str(i)
    if (hundreds in evens and
        tens in evens and ones in evens):
        print(i)

Обяснение:

  1. evens, hudreds, tens, ones    по-русски    четные, сотни, десятки, единицы.

  2. "0 2 4 6 8".split() — то же самое как ['0', '2', '4', '6', '8'], но короче.

  3. range(200, 401, 2) - достаточно начинать с 200, потому первая цифра не может быть 1, и тестировать только каждое второе, т. е. четное число.

  4. str(i) - это итеровательный объект (строка из трея букв), значит, мы можем из него получить отдельные буквы распаковкой hundreds, tens, ones = str(i).

▲ -1

А такого ещё никто не предлагал: tio.run

def go(l, r):
  x,ds = 0,[[2,4]]

  while x < r:
    if x >= l:
      yield x

    for d in ds:
      if d[1]:
        x += d[0]
        d[1] -= 1
        break

      d[1] = 4
      x -= 4 * d[0]
    else:
      dnext = ds[-1][0] * 10
      x += dnext
      ds.append([dnext, 3])

for x in go(200, 401):
  print(x)