Логическое значение True или False при нахождении двух последовательных цифр в заданном целом числе без использования каких-либо встроенных функций

#python #if-statement #while-loop #iteration

#python #if-оператор #цикл while #итерация

Вопрос:

Чтобы найти две последовательные цифры (D) в заданном целом числе (N) без использования каких-либо встроенных функций и возврата True или False, следующий код, похоже, завершается при нахождении одного D, однако он работает, если есть два Ds. Почему это не работает так, как есть, и как это исправить? Спасибо!

 def double_digits(n, d):
    """Return True if N has two Ds in a row otherwise return False.

    int, int -> Boolean

    >>> double_digits(91019, 1)
    False
    >>> double_digits(88, 8)
    True
    >>> double_digits(2772, 7)
    True
    >>> double_digits(88108, 0)
    False
    >>> double_digits(12345, 4)
    False
    >>> double_digits(81811081, 1)
    True
    """
    while n > 0:
        remainder = n % 10
        n = n // 10
        if remainder == d:
            if n % 10 == d:
                return True
            else:
                remainder, n = n % 10, n // 10
    return False
  

Комментарии:

1. Ваш while цикл всегда возвращается на первой итерации. Вероятно, это не то, что вам нужно для этого.

2. Вероятно, в финале return False слишком большой отступ, хотя я еще не полностью проверил логику.

3. Что именно вы считаете «встроенной функцией» и почему существует такое произвольное ограничение? Это может быть решено вообще без математики, просто простым for циклом, который запоминает предыдущую итерацию. FWIW, не слишком уверен в % , но == // и ‘>’ также запускают «встроенную функцию»

4. @DeepSpace Как вы получаете каждую цифру значения int без какой-либо математики?

5. @Code-Ученик, for digit in str(n): затем также преобразуйте d в str

Ответ №1:

Последний оператор return должен быть вне цикла. Ниже приведен правильный код:

    def double_digits(n, d): 
    while n > 0:
        remainder = n % 10
        n = n // 10
        if remainder == d:
            if n % 10 == d:
                return True
            else:
                remainder, n = n % 10, n // 10
    return False
  

Комментарии:

1. 1. Правильно и исправлено. 2. предложение else сокращает итерации. Попробуйте на pythontutor.com/visualize.html с double_digits(91019, 1)

2. Да, просто исправил мой ответ, пропустил ту часть, которая гарантирует, что другой символ не является d, который вы отбрасываете при проверке.

Ответ №2:

Вы должны сделать отступ в последнем операторе : вернуть False, 4 пробела слева. Это должно вам помочь.
В качестве альтернативы вы можете преобразовать входные данные в строку, и тогда сопоставление символов будет простым.

 def double_digits(n: int, d: int)->bool:
    n = str(n)
    d = str(d)
    i = 0
    while i < len(n)-1:
        if n[i] == d and n[i 1] == d:
            return True
        i =1
    return False
  

Здесь я использовал некоторые встроенные функции, такие как len и str , но если вы явно

хотите избежать их использования, просто придерживайтесь своего оригинального подхода и просто сделайте отступ в инструкции return один раз

Комментарии:

1. Вы слишком сильно уменьшили отступ, его больше нет в функции.

2. len(n-1) должно быть len(n) - 1 , Python использует and (не amp;amp; ), и будет бесконечный цикл, поскольку i всегда остается 0

3. Вот и все. Неправильный отступ. Спасибо!