Ошибка в вашем коде заключается в том, что в цикле 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).