python小技巧:取个十百千位;数字翻转

取个十百千位

def num_intract():
    num = int(input("请输入四位数的数字:"))
    a = num % 10
    b = num // 10 % 10
    c = num // 100 % 10
    d = num // 1000

    print(d, c, b, a)


num_intract()

数字翻转

如果反转后整数超过 32 位的有符号整数的范围:[−2^31, 2^31 − 1]如果反转整数溢出,就返回0。、
对于//,是向下取整,即不会进行四舍五入,这个需要注意。
精妙解法:
这个算法的思想就是:取绝对值计算,每次循环抽出个位数和剩下的部分,个位数*10往左进一位,每次循环的累加起来,判断是否超出边界。
res,y
3,12
32,1
321,0

def reverse_better(x: int) -> int:
    y, res = abs(x), 0   # 取绝对值
    print(y)
    # 32位整数则其数值范围为 [−2^31,  2^31 − 1]
    boundry = (1 << 31) - 1 if x > 0 else 1 << 31
    # 1<<31 : 在十进制的1的二进制码后面添加31个0后表示的十进制的数是2147483648,恰好等于 2的31次方,减1后为2147483647,为32位有符号整数上限
    print(boundry)
    while y != 0:
        res = res * 10 + y % 10
        print(res)
        if res > boundry:
            return 0
        y //= 10
        print(y)
    return res if x > 0 else -res


print(reverse_better(x=-123))

知识点补充:>>.<<
A>>B A的二进制码右移B位,二进制码去掉B位

3>>1 输出 1

bin(3):0b11

bin(1):0b1

即3的二进制码11去掉一位后位1,即是十进制的1

A >> B 即 A / (2 ** B)

A / (2 ** B): 可用于计算文件大小,比如2048B 的文件 2048 >> 10 结果2M 2048 / (2 ** 10) = 2

A<<B A的二进制码左移B位,A的二进制码后加B个0

3<<1 输出 6

bin(3):0b11

bin(6):0b110

A << B 即 A * (2 ** B)

posted @ 2023-08-21 17:28  jessie嘉  阅读(604)  评论(0)    收藏  举报