Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Целочисленное деление отрицательных целых чисел

#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.

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

Отправить комментарий