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

Это актуальный вопрос: напишите программу на 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 ........

1
Arijeet Acharyya 20 Дек 2018 в 19:41

2 ответа

Лучший ответ

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

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

Требования (a) и (c) можно объединить в одно требование : если вы знаете математику средней школы, (a) в основном означает, что само число делится на 3, а (c) означает, что оно делится на 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) и ( с) . Затем мы проверяем число, с которым мы сталкиваемся, для условия (b).

1
tfpf 20 Дек 2018 в 18:33

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

numbers = numbers // 10

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

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

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

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

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))
1
Iulian 21 Дек 2018 в 17:18