Как проверить, четные или нечетные цифры подряд идущих в номере? - PullRequest
2 голосов
/ 29 мая 2020

Я делаю упражнения и учусь Python. Мне нужно проверить входной номер, четные или нечетные его последовательные цифры. Итак, если первое число нечетное, следующее должно быть четным и так далее, чтобы условия соответствовали условиям. У меня есть следующий код:

def par_nepar(n):
    cifre = []

    while n != 0:
        cifre.append(n % 10)
        n //= 10

    cifre = cifre[::-1]
    ind = cifre[0]
    for broj in cifre:
        if cifre[0] % 2 == 0:
            # for br in range(len(cifre)):
            if cifre[ind + 1] % 2 != 0:
                ind = cifre[ind+1]

n = int(input("Unesite broj n: "))
print(par_nepar(n))

Как видите, я борюсь с циклом индекса. Я взял введенный номер и преобразовал его в список. Создал переменную для индекса [0] и действительно не знаю, как l oop через последовательные индексы. Я знаю, что могу использовать zip или enumerate, но я думаю, что это не настоящее решение pythoni c, и, вероятно, есть более простой способ l oop по последовательным номерам списков и сравнить их с index [-1] .

Примеры ввода:

>>>print(par_nepar(2749)) # Every consecutive digits shifts odd->even or even->odd
True
>>>print(par_nepar(2744)) # Two last digits are even
False

Ответы [ 5 ]

1 голос
/ 29 мая 2020

мое решение очень простое. просто немного измените свой код и избегайте использования индексов, просто перебирая все цифры в cifre и обрабатывая логические флаги:

def par_nepar(n):
    cifre = []

    while n != 0:
        cifre.append(n % 10)
        n //= 10

    even = True
    odd = True
    output = "The number complies to the needed terms"

    for broj in cifre:
        if broj % 2 == 0 and odd:
            even = True
            odd = False
        elif broj % 2 != 0 and even:
            odd = True
            even = False
        else:
            return "The number doesn't comply to the needed terms."
    return output
n = int(input("Unesite broj n: "))
print(par_nepar(n))

output:

Unesite broj n: 33890
The number doesn't comply to the needed terms.

Unesite broj n: 4963850
The number complies to the needed terms
1 голос
/ 29 мая 2020

попробуйте это:

def par_nepar(n):

    split = [int(i) for i in str(n)]. 

    for i in range(1,len(split)):

        if (split[i] % 2 == 0) ^ (split[i-1] % 2 == 1):
            return False

    return True

Работает как:

  1. Преобразует целое число в список: 1234 -> [1,2,3,4]
  2. перебирать элементы (исключая первый)
  3. Условие XOR, которое принимает False, если две последовательные цифры четные или нечетные.

Тесты:

>>> print(par_nepar(2749))
True

>>> print(par_nepar(2744))
False
0 голосов
/ 29 мая 2020

Может быть, вам также понравится этот лайнер.

В одном l oop мы выясняем, совпадает ли число mod 2 с (первое число + индекс) mod 2.

Это работает для вас в альтернативном варианте использования.

par_nepar = lambda x: all([(int(k) % 2) == ((i + int(str(x)[0])) % 2) for (i, k) in enumerate(str(x))])

print(par_nepar(2749))
print(par_nepar(2744))

# Output
True
False

Или, если вы хотите, со строками, которые вы сказали, немного больше

par_nepar = lambda x: 'The number complies to the needed terms. ' if all(
    [(int(k) % 2) == ((i + int(str(x)[0])) % 2) for (i, k) in
     enumerate(str(x))]) else "The number doesn't comply to the needed terms."

#Output
The number complies to the needed terms.
The number doesn't comply to the needed terms.
0 голосов
/ 29 мая 2020
def par_nepar(n):
    cifre = list(str(n))
    flg = False
    if int(cifre[0]) % 2 == 0:
        flg = True
    for d in cifre[1:]:
        _flg = False
        if int(d) % 2 == 0:
            _flg = True
        if not flg^_flg:
            print("The number does not complies to the needed terms")
            return
        flg = _flg
    print("The number complies to the needed terms")
    return
0 голосов
/ 29 мая 2020

Я думаю, вместо того, чтобы вводить целое число, вы можете получить строку и преобразовать ее в список целых чисел

def par_nepar(n):
    s,h=0,0
    for i in range(len(n)-1):
        if n[i]%2==0 and n[i+1]%2!=0:
            s+=1
        elif n[i]%2!=0 and n[i+1]%2==0:
            h+=1
    if s==len(n)//2 or h==len(n)//2:
        print("The number complies to the needed terms")
    else:
        print("The number does not complies to the needed terms")

# list of digits in the provided input
n = list(map(lambda x: int(x),list(input("Unesite broj n: "))))
par_nepar(n)
...