#python
Вопрос возник при решении задачи о палиндроме.
Вот решение
def palindrom(param):
# convert to str
word = str(param)
# in cycle char by char comparing from start and from end to middle of the word
return True if word[:len(word)//2] == word[:-len(word)//2-1:-1] else False
if palindrom(input("give me a word: ")):
print("Палиндром")
else:
print("Та ну не")
которое работает для слов четной длины, и не работает для слов с нечтным количеством
символов.
Оказалось, что 7//2==3, а -7//2==-4
то есть задачу то я решил:
return word[:len(word)//2] == word[:-(len(word)//2)-1:-1]
но почему так реализовано целочисленное деление?
Хотелось бы -7//2 ==-3.
Какой тут глубинный смысл? А то ведь
7//2 + (- 7//2) == -1
7//2 - 7//2 == 0
P.S.: признателен gil9red за подсказки и краткое решение задачи о палиндроме
в примечаниях ниже.
P.P.S.: что интересно, операции побитового двоичного сдвига тоже соблюдают данное
правило:
7>>1 == 3
-7>>1 == -4
Ответы
Ответ 1
Дело в том, как определяется целочисленное деление. Определение Разделить целое число a на целое число b!=0 с остатком — это значит найти такие два целых q и r, которые удовлетворяют следующим условиям: 1) a = b * q + r; 2) 0 <= r < |b|. Тогда из определения будет: -7 // 2 = -4 Объяснение: При делении отрицательного числа на положительное, получится отрицательное число Можно предположить, что правильный ответ -3, но в этом случае умножив -3 * 2 мы получим -6. Чтобы получить исходное -7 нужно к результату прибавить число -1, но остаток не может быть отрицательным по определению(r>=0). По этому в данном случае остаток равен 1 и частное равно -4.
Комментариев нет:
Отправить комментарий