#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:ShidongDu time:2020/3/7
'''
【题目】
给定两个32位整数a和b,可正、可负、可0。不能使用算术运算符,分别实现a和b的加减乘除运算。
【要求】
如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不必对那些结果负责。
'''
# 除法是乘法的逆运算
# 先转换为正数相除,再根据符号位判断结果的正负
# 负数的范围比正数的范围多1,因此转换为正数(abs),存在溢出问题,java需要考虑整型溢出问题,python无需考虑。
# 这里a,b均为整数
def add(a, b):
if b == 0:
return a
# a, b互为相反数
if a == -b:
return 0
flag = False
# 异号数之和大于0,转换加数符号
if a < 0 and b > 0:
if -a < b:
flag = True
a = -a
b = -b
if a > 0 and b < 0:
if a > -b:
flag = True
a = -a
b = -b
while b != 0:
res = a ^ b
b = (a & b) << 1
a = res
if flag is True:
res = -res
return res
def sub(a, b):
return add(a, -b)
def multi(a, b):
sign_a = 0 # a的符号位
sign_b = 0 # b的符号位
# 提取符号位
if a < 0:
sign_a = 1
a = -a
if b < 0:
sign_b = 1
b = -b
res = 0
while b != 0:
if b & 1 == 1:
res = add(res, a)
a = a << 1
b = b >> 1
if sign_a ^ sign_b == 1:
res = -res
return res
def div(a, b):
# 除数为0
if b == 0:
raise ZeroDivisionError("除0错误")
sign_a = 0 # a的符号位
sign_b = 0 # b的符号位
# 提取符号位
if a < 0:
sign_a = 1
a = -a
if b < 0:
sign_b = 1
b = -b
res = 0
fac = 1 << 31
for i in range(0, 32):
if a >= multi(b, fac):
res = add(res, fac)
a = sub(a, multi(b, fac))
fac = fac >> 1
if sign_a ^ sign_b == 1:
res = -res
return res
print(div(6, 9))
python实现除法
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 题目:不使用除法操作符实现两个正整数的除法? 分析:减法运算法。使被除数不断减去除数,直到相减的结果小于除数为止,...
- math.floor() & math.trunc() math.floor 和 math.trunc的官方不同版...
- 转载请注明出处:http://www.jianshu.com/p/7a3d3d86b97f本文出自Shawpoo的...