Python的除、整除、取余、四舍五入

1. 除 & 四舍五入

除用 / 表示
整数的除会显示一位小数

print(18 / 3)
6.0

出现无法除尽的数或者结果不准确的数,可使用四舍五入的方法进行处理

1.1 round

round的作用是四舍五入以及处理小数点位数

print(round(5.47834))
5 # 不输入参数的情况下默认输出整数
print(10 / 3)
3.3333333333333335 # 无法除尽

print(round(10 / 3, 4)) # 第二个参数的含义是保留的小数点位数
3.3333

1.2 floor

floor的含义为向下取整

print(math.floor(3.99999))
3

print(math.floor(-4.101))
-5

1.3 ceil

ceil则为向上取整

print(math.ceil(9.00001))
10

print(math.ceil(-40.9090909))
-40

2. 整除

经过整除后所得的数为除的结果的向下取整

print(16 / 3)
5.333333333333333

print(16 // 3)
5

print(-23 / 3)
-7.666666666666667

print(-23 // 3)
-8

3.取余

print(23 % 3)
2 # 3 * 7 + 2 = 23

print(-23 % 3)
1 # -8 * 3 + 1 = - 23

由上方结果可得出,无论被除数是正数还是负数,取余操作的结果均为正数
且取余操作的 商 * 被除数 = 小于被除数的最大整数,
例如在上方例子中 小于-23的最大整数为-24,所以商为-8,取余结果为 -23 - (-24) = 1

Leetcode 9. 回文数

根据以上内容,可以完成此题。
思路为以数学的方法反向重构目标数字。

def isPalindrome(self, x: int) -> bool:
    if x < 0:
        return False
    sub = x
    ans = 0
    while sub != 0:
        # rem为10的取余,即当前sub的最后一位数字
        rem = sub % 10
        # ans为最终反向重构的结果,每次迭代乘10(即进一位),再加上取余的结果rem
        ans = ans * 10 + rem
        # sub通过整除10的方法,移除最后一位数字
        sub = sub // 10
    # 比较重构结果ans与输入值x
    if ans == x:
        return True
    else:
        return False

Leetcode 8. 字符串转换整数 (atoi)

此题中需要注意的是对32 位有符号整数范围 [−231, 231 − 1]的操作

def myAtoi(self, s: str) -> int:
    INT_MAX = 2147483647 # 2^31^ − 1
    INT_MIN = -2147483648 # −2^31^
    start = 0
    ans = 0
    flag = 1
    n = len(s)
    if not s:
        return 0
    while start < n and s[start] == " ":
        start += 1
    if start == n:
        return 0
    if s[start] == "-":
        flag = -1
    if s[start] == "+" or s[start] == "-":
        start += 1
    while start < n and s[start].isdigit():
        tmp = int(s[start])
        # 当前结果ans为正数时,对比ans与INT_MAX整除10的结果
        # 若ans > INT_MAX // 10,则当执行ans = ans * 10 + tmp后,ans必定大于INT_MAX
        # 同样,如果ans == INT_MAX // 10, 当前遍历到的数字tmp若大于INT_MAX的最后一位7时,ans必定大于INT_MAX
        if flag == 1 and (ans > INT_MAX // 10 or (ans == INT_MAX // 10 and tmp > 7)):
            return INT_MAX
        # 当结果ans符号为负时,对比-ans与INT_MIN // 10 + 1,因为INT_MIN // 10 = -214748365
        # 若 -ans < INT_MIN // 10 + 1 (即小于-214748364)时,下次迭代 -ans必定小于INT_MIN
        # 同样,如果 -ans == INT_MIN // 10 + 1,tmp大于INT_MIN的最后一位8时,-ans必定小于INT_MIN
        if flag == -1 and (-ans < INT_MIN // 10 + 1 or (-ans == INT_MIN // 10 + 1 and tmp > 8)):
            return INT_MIN
        ans = ans * 10 + tmp
        start += 1
    return ans * flag
posted @ 2021-02-18 23:55  Ravenna  阅读(2248)  评论(0编辑  收藏  举报