Как включить множество циклов принятия решений для правильной проверки числа в диапазоне? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь решить вопрос, чтобы сгенерировать список чисел из заданного диапазона, пропустив каждое число через набор правил для добавления этого числа в список.Также найти максимальный элемент из списка.

Это актуальный вопрос: напишите программу на python, которая находит максимальное число от num1 до num2 (включая num2) на основе следующих правил.

  1. Всегда num1 должно быть меньше чем num2
  2. Рассмотрим каждое число от num1 до num2 (включая num2).Заполните число в списке, если выполнены следующие условия: а) Сумма цифр числа кратна 3 б) Число имеет только две цифры в) Число кратно 5
  3. Отобразитьмаксимальное количество элементов в списке

В случае каких-либо недопустимых данных или если список пуст, выведите -1. ​​

Прежде всего, я новичок в Python и не знаком срешить этот тип сложных проблем.Поэтому я думаю, что сделал много глупых ошибок.

def find_max(num1, num2):

    max_num=-1
    num_list=[] #list declared
    if(num1<num2): #to check num1 < num2 as said in the question
        for numbers in range(int(num1),int(num2)+1): #for numbers from the range
            tot=0
            count=0
            while(numbers>0): 
                digit=numbers%10
                tot=tot+digit #to generate sum of digits
                numbers=numbers//10 
                count=count+1 #to count the number of digits
                if(tot%3==0 and count==2 and numbers%5==0): 
                    num_list.append(numbers) #to generate the list
                else:
                    print(-1)
    else:
        print(-1)
    max_num = max(num_list) #to find the maximum value in the list
    return max_num

#Provide different values for num1 and num2 and test your program.
max_num=find_max(10,15)
print(max_num)

Результаты, которые я получаю: -1 -1 -1 ........

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Ошибка в вашем коде заключается в том, что в цикле while вы изменяете значение, которое проверяется для условий.(Лулиан хорошо объяснил это.)

На самом деле, ваш код можно переписать проще.У вас есть эти требования.(a) Сумма цифр номера кратна 3. (b) Номер имеет только две цифры (c) Число кратно 5.

Требования (a) и (c)) можно объединить в одно требование : если вы знаете математику средней школы, (а) в основном означает, что само число делится на 3, и (в) означает, что оно делится на 5. Вместе они означают, чточисло должно делиться на 3, умноженное на 5, т. е. 15. Мы можем использовать это свойство.

Давайте вернемся к проблеме.Заметьте, что каждый раз, когда обнаруживаются недействительные данные, я использую оператор return.

def find_max(num1, num2):

    # check for invalid data: 'num1' and 'num2' should be integers
    if type(num1) != int or type(num2) != int:
        return -1

    # check if 'num1' is greater than 'num2'
    if num1 > num2:
        return -1

    # initialize empty list
    num_list = []

    # find the nearest multiple of 15 to 'num1'
    if num1 % 15 == 0:
        nearest_multiple = num1
    else:
        nearest_multiple = num1 + 15 - num1 % 15

    # scan through possible numbers from 'nearest_multiple' to 'num2'
    for numbers in range(nearest_multiple, num2 + 1, 15):
        if 10 <= numbers <= 99 or -99 <= numbers <= -10:
            num_list.append(numbers)

    # if no valid number was detected, the list will remain empty
    if num_list == []:
        return -1

    return max(num_list)

Объяснение: Сначала найдите ближайшее кратное 15, большее или равное num1.Итак, если num1 равно 15, то nearest_multiple также равно 15. Но если num1 было бы 21, тогда nearest_multiple было бы 30. (Используемая формула - чистая математика.) Затем мы выполняем итерацию с nearest_multipleдо num2 в прыжках 15. Таким образом, мы встречаемся с только числами, которые удовлетворяют и (a) и (c).Затем мы проверяем число, с которым мы сталкиваемся, для условия (b).

0 голосов
/ 26 августа 2019

def find_max (num1, num2):

# check for invalid data: 'num1' and 'num2' should be integers
if type(num1) != int or type(num2) != int:
    return -1

# check if 'num1' is greater than 'num2'
if num1 >=num2:
    return -1

# initialize empty list
num_list = []

# find the nearest multiple of 15 to 'num1'
if num1 % 15 == 0:
    nearest_multiple = num1
else:
    nearest_multiple = num1 + 15 - num1 % 15

# scan through possible numbers from 'nearest_multiple' to 'num2'
for numbers in range(nearest_multiple, num2 + 1, 15):
    if 10 <= numbers <= 99 or -99 <= numbers <= -10:
        num_list.append(numbers)

# if no valid number was detected, the list will remain empty
if num_list == []:
    return -1

return max(num_list)
0 голосов
/ 20 декабря 2018

Ваша функция работает не так, как вы хотите, потому что вы используете numbers для проверки условия, но вы изменяете его в своем коде, когда выполняете вычисления.

numbers = numbers // 10

Так что, когда вы 'Я буду использовать его в блоке if, numbers будет иметь другое значение, отличное от исходного.Например, при числах = 15 при запуске оно станет:

числа -> 15 -> 1 -> 0

Таким образом, когда вы проверяете numbers % 5 == 0, оно никогда не пройдет, а условное условие не будет выполнено.Используйте копию числа, и все будет хорошо работать.

Повторный код:

def function_name(num1,num2):
  num_list=[] #list declared

  if(num1<num2): #to check num1 < num2 as said in the question
      for numbers in range(int(num1),int(num2)+1): #for numbers from the range
        tot=0
        count=0
        copy = numbers
        while(copy>0): 
            digit=copy%10
            tot=tot+digit #to generate sum of digits
            copy = copy//10 
            count = count+1 #to count the number of digits
            if(tot%3==0 and count==2 and numbers%5==0): 
                num_list.append(numbers) #to generate the list
            else:
                print(-1)
  else:
      print(-1)
  if num_list:#if the list is populates with some numbers
    return max(num_list)
  else: return "what you think is needed in case there aren't numbers" #None is a good choice equivalent to null in other programming languages

print(function_name(10,15))

Моя идея реализовать вашу функцию

Не самая лучшая, но она корочеи более читабельным.

def function_name(num1,num2):
  num_list=[] #list declared

  if(num1<num2): #to check num1 < num2 as said in the question
      for number in range(int(num1),int(num2)+1): #for numbers from the range

        # for every char return its int and group all in a list
        # [int(digit) for digit in str(number)]
        tot = sum( [int(digit) for digit in str(number)])

        #count how many char are that is like saying how many digits
        count= len(str(number)) 

        if(tot%3==0 and count==2 and number%5==0): 
            num_list.append(number) #to generate the list
        else:
            print(-1)
  else:
      print(-1)
  if num_list:#if the list is populates with some numbers
    return max(num_list)
  else: 
    return "what you think is needed in case there aren't numbers" #None is a good choice equivalent to null in other programming languages

print("Max", function_name(10,15))
...