Код не работает для нечетного числа на десятки и сотни мест - PullRequest
0 голосов
/ 16 октября 2018

вопрос:

Напишите программу, которая найдет все такие числа от m до n (включая оба), чтобы каждая цифра числа была четным числом.

Формат ввода:
Первая строка содержит значения m и n, разделенные запятой.

Формат вывода:
Полученные числа должны быть напечатаны в отдельной строке через запятую.

Ограничения:

  • 1000<=m<=9000
  • 1000<=n<=9000

Однако мой код работает только тогда, когда нет нечетного числаприсутствует на сотнях и тысячах мест.Куда я иду не так?Контрольные примеры и ожидаемые результаты:

Контрольный пример 1

  • ввод: 2000,2020
  • вывод: 2000,2002,2004,2006, 2008,2020

Контрольный пример 2

  • вход: 2000,2050
  • выход: 2000,2002,2004,2006,2008,2020,2022,2024,2026,2028,2040,2042,2044,2046,2048

Контрольный пример 3

  • вход: 1000,2000
  • выход: 2000

Тестовый случай 3 не выполняется в моем случае.Почему это так?

num=list(map(int,input().split(",")))
length=len(num)
list=[]
first=num[0]
last=num[length-1]
for i in range(first,last+1):
    count=0
    num1 = i
    k=i
    for j in range(4):
        last_digit=k%10
        k=i//10
        if(last_digit%2==0):
            count=count+1
    if(count==4):
        list.append(num1)
length2=len(list)
for i in range(length2):
    if(i<length2-1):
        print(list[i],end=',')
    else:
        print(list[i])

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Ваша ошибка лежит здесь:

k=i
for j in range(4):
    last_digit=k%10
    k=i//10

Вы присваиваете i // 10 k каждой итерации, и i никогда не меняется, поэтому вы всегда смотрите только на две последние цифры, но никогда ничегоостальное.Если i начинается с 1234, то k начинается с 1234, last_digit становится 4 и k становится 123.С этого момента вы смотрите только на 123 (last_digit будет 3 и k = i // 10, поэтому 123 снова, каждая итерация).

Вам нужно разделить k:

k=i
for j in range(4):
    last_digit=k%10
    k=k//10

Более простым способом будет сравнение цифр (строковых значений) с набором четных цифр:

even = set('02468')

results = []
for i in range(first, last + 1):
    if set(str(i)) <= even:  # only even digits used
        results.append(i)
0 голосов
/ 16 октября 2018

Для удобства чтения я бы написал что-то вроде этого:

nums = list(map(int, input().split(",")))
all_even = []

for num in range(nums[0], nums[1]+1):
  # Skips the num if it's not even
  if num % 2 != 0:
    continue

  # Skips the num if any of its digits is not even
  # Note that it'll skip on the first item that is not even
  # so it is rather efficient as it does not necessarily 
  # need to iterate over *all* digits
  if any(int(digit) % 2 != 0 for digit in str(num)):
    continue

  # Appends the num to the final list
  all_even.append(str(num))

print(','.join(all_even))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...