Python3如何实现十六进制长除法?
How to realize Hexadecimal long division in Python3?
我想实现计算器,计算器应该使用 2,8,10,16 符号。
我已经做了:add、sub、mul,但我完全不明白如何实现div 表示 16 位符号。是的,我是 Python.
的新人
如何为我的 class 计算器实现十六进制 long division?
我的代码:
numbers = {'0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'A': '10', 'B': '11', 'C': '12', 'D': '13', 'E': '14', 'F': '15', '-': '-'}
rev_numbers = {'0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'10': 'A', '11': 'B', '12': 'C', '13': 'D', '14': 'E', '15': 'F', '-': '-'}
class Calculator:
def __init__(self, num, num2, system):
self.result = []
self.shift = 0
self.system = system
def __add__(self, l1, l2):
self.result = []
max_len = max(len(l1), len(l2))
l1, l2 = l1.rjust(max_len, '0'), l2.rjust(max_len, '0')
if self.system == 16:
l1 = [numbers[value] for value in l1 if
value in numbers.keys()]
l2 = [numbers[value] for value in l2 if value in numbers.keys()]
for i in range(max_len - 1, -1, -1):
r = int(l1[i]) + int(l2[i]) + self.shift
self.shift = r // self.system
r = r % self.system
self.result.append(str(r))
if self.shift > 0:
self.result.append(str(self.shift))
r = [rev_numbers[value] for value in self.result if
value in rev_numbers.keys()]
self.shift = 0
return ''.join(r)[::-1]
def __sub__(self, l1, l2):
char = ''
if len(l1) < len(l2):
l1, l2 = l2, l1
char = '-'
max_len = max(len(l1), len(l2))
l1, l2 = l1.rjust(max_len, '0'), l2.rjust(max_len, '0')
if self.system == 16:
l1 = [numbers[value] for value in l1 if value in numbers.keys()]
l2 = [numbers[value] for value in l2 if value in numbers.keys()]
for i in range(max_len - 1, -1, -1):
r = int(l1[i]) - int(l2[i]) - self.shift
if r >= 0:
self.result.append(str(r))
self.shift = 0
else:
r += self.system
self.shift = 1
self.result.append(str(r))
if char == '-':
self.result.append(char)
r = [rev_numbers[value] for value in self.result if value in rev_numbers.keys()]
self.result = []
r = ''.join(r)[::-1]
return r.lstrip('0')
我没有完全理解你想要的操作是什么。但是只要你想在python中划分长数你可以在下面看到我的答案。
# Python3 program to implement division
# with large number
import math
# A function to perform division of
# large numbers
def longDivision(number, divisor):
# As result can be very large
# store it in string
ans = "";
# Find prefix of number that
# is larger than divisor.
idx = 0;
temp = ord(number[idx]) - ord('0');
while (temp < divisor):
temp = (temp * 10 + ord(number[idx + 1]) -
ord('0'));
idx += 1;
idx +=1;
# Repeatedly divide divisor with temp.
# After every division, update temp to
# include one more digit.
while ((len(number)) > idx):
# Store result in answer i.e. temp / divisor
ans += chr(math.floor(temp // divisor) + ord('0'));
# Take next digit of number
temp = ((temp % divisor) * 10 + ord(number[idx]) -
ord('0'));
idx += 1;
ans += chr(math.floor(temp // divisor) + ord('0'));
# If divisor is greater than number
if (len(ans) == 0):
return "0";
# else return ans
return ans;
# Driver Code
number = "1248163264128256512";
divisor = 125;
print(longDivision(number, divisor));
# This code is contributed by mits
对于任何基地第一:
按数字
实现左移<<
和右>>
运算
在字符串上很简单,只需将数组向左或向右复制一个字符,然后从另一侧插入零。如果有符号基数的补数右移,则复制最高有效位,因此零表示正数,负数表示 base-1
。这样号码仍然会被签名...
这个操作也是multiplication/division base.
A*Base = A<<1
A/Base = A>>1
A*Base*Base = A<<2
A*Base*Base*Base = A<<3
...
实现两数相减
你声称你已经拥有这个...
实现两个数的比较
这与减法相同,但不是 return 计算结果 return 只是减法是否溢出或归零...这将告诉您数字是否为 ==,<或 >。我通常把结果编码成
-1 A<B
0 A==B
+1 A>B
现在长除法
C = A/B // division
D = A%B // remainder
我没有在 python 中编码,但在无符号整数的伪代码中它会是这样的:
C=0; // division
D=A; // remainder
q=1; // actual weight of B
if (B==0) handle division by zero !!!
while (A>=B) // shift B so its biggest and still smaller or equal to A
{
B=B<<1;
q=q<<1;
}
if (q>1)
{
B=B>>1;
q=q>>1;
}
for (;q>0;) // long division
{
while (D>=B)
{
D=D-B;
C=C+q;
}
B=B>>1; // shift right by one digit
q=q>>1;
}
对于带符号的数字,您可以先提取结果的符号,然后除以 abs 值。
对于小数,您需要添加小数点并在达到与之前相同的余数时结束除法,或者达到最大小数位数。您还需要稍微更改 B 的初始移位,因为它从一开始就可以比 A 大很多,所以添加时会是另一个向右移位。
所有这些都可以在字符串上实现,因此您不需要像现在那样转换为整数并返回,这容易受到整数限制的影响,因此限制了所用数字的大小...
如您所见,长除法与移位加乘法非常相似(只是向相反方向移位并减去而不是加)
我想实现计算器,计算器应该使用 2,8,10,16 符号。
我已经做了:add、sub、mul,但我完全不明白如何实现div 表示 16 位符号。是的,我是 Python.
的新人
如何为我的 class 计算器实现十六进制 long division?
我的代码:
numbers = {'0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'A': '10', 'B': '11', 'C': '12', 'D': '13', 'E': '14', 'F': '15', '-': '-'}
rev_numbers = {'0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'10': 'A', '11': 'B', '12': 'C', '13': 'D', '14': 'E', '15': 'F', '-': '-'}
class Calculator:
def __init__(self, num, num2, system):
self.result = []
self.shift = 0
self.system = system
def __add__(self, l1, l2):
self.result = []
max_len = max(len(l1), len(l2))
l1, l2 = l1.rjust(max_len, '0'), l2.rjust(max_len, '0')
if self.system == 16:
l1 = [numbers[value] for value in l1 if
value in numbers.keys()]
l2 = [numbers[value] for value in l2 if value in numbers.keys()]
for i in range(max_len - 1, -1, -1):
r = int(l1[i]) + int(l2[i]) + self.shift
self.shift = r // self.system
r = r % self.system
self.result.append(str(r))
if self.shift > 0:
self.result.append(str(self.shift))
r = [rev_numbers[value] for value in self.result if
value in rev_numbers.keys()]
self.shift = 0
return ''.join(r)[::-1]
def __sub__(self, l1, l2):
char = ''
if len(l1) < len(l2):
l1, l2 = l2, l1
char = '-'
max_len = max(len(l1), len(l2))
l1, l2 = l1.rjust(max_len, '0'), l2.rjust(max_len, '0')
if self.system == 16:
l1 = [numbers[value] for value in l1 if value in numbers.keys()]
l2 = [numbers[value] for value in l2 if value in numbers.keys()]
for i in range(max_len - 1, -1, -1):
r = int(l1[i]) - int(l2[i]) - self.shift
if r >= 0:
self.result.append(str(r))
self.shift = 0
else:
r += self.system
self.shift = 1
self.result.append(str(r))
if char == '-':
self.result.append(char)
r = [rev_numbers[value] for value in self.result if value in rev_numbers.keys()]
self.result = []
r = ''.join(r)[::-1]
return r.lstrip('0')
我没有完全理解你想要的操作是什么。但是只要你想在python中划分长数你可以在下面看到我的答案。
# Python3 program to implement division
# with large number
import math
# A function to perform division of
# large numbers
def longDivision(number, divisor):
# As result can be very large
# store it in string
ans = "";
# Find prefix of number that
# is larger than divisor.
idx = 0;
temp = ord(number[idx]) - ord('0');
while (temp < divisor):
temp = (temp * 10 + ord(number[idx + 1]) -
ord('0'));
idx += 1;
idx +=1;
# Repeatedly divide divisor with temp.
# After every division, update temp to
# include one more digit.
while ((len(number)) > idx):
# Store result in answer i.e. temp / divisor
ans += chr(math.floor(temp // divisor) + ord('0'));
# Take next digit of number
temp = ((temp % divisor) * 10 + ord(number[idx]) -
ord('0'));
idx += 1;
ans += chr(math.floor(temp // divisor) + ord('0'));
# If divisor is greater than number
if (len(ans) == 0):
return "0";
# else return ans
return ans;
# Driver Code
number = "1248163264128256512";
divisor = 125;
print(longDivision(number, divisor));
# This code is contributed by mits
对于任何基地第一:
按数字
实现左移<<
和右>>
运算在字符串上很简单,只需将数组向左或向右复制一个字符,然后从另一侧插入零。如果有符号基数的补数右移,则复制最高有效位,因此零表示正数,负数表示
base-1
。这样号码仍然会被签名...这个操作也是multiplication/division base.
A*Base = A<<1 A/Base = A>>1 A*Base*Base = A<<2 A*Base*Base*Base = A<<3 ...
实现两数相减
你声称你已经拥有这个...
实现两个数的比较
这与减法相同,但不是 return 计算结果 return 只是减法是否溢出或归零...这将告诉您数字是否为 ==,<或 >。我通常把结果编码成
-1 A<B 0 A==B +1 A>B
现在长除法
C = A/B // division
D = A%B // remainder
我没有在 python 中编码,但在无符号整数的伪代码中它会是这样的:
C=0; // division
D=A; // remainder
q=1; // actual weight of B
if (B==0) handle division by zero !!!
while (A>=B) // shift B so its biggest and still smaller or equal to A
{
B=B<<1;
q=q<<1;
}
if (q>1)
{
B=B>>1;
q=q>>1;
}
for (;q>0;) // long division
{
while (D>=B)
{
D=D-B;
C=C+q;
}
B=B>>1; // shift right by one digit
q=q>>1;
}
对于带符号的数字,您可以先提取结果的符号,然后除以 abs 值。
对于小数,您需要添加小数点并在达到与之前相同的余数时结束除法,或者达到最大小数位数。您还需要稍微更改 B 的初始移位,因为它从一开始就可以比 A 大很多,所以添加时会是另一个向右移位。
所有这些都可以在字符串上实现,因此您不需要像现在那样转换为整数并返回,这容易受到整数限制的影响,因此限制了所用数字的大小...
如您所见,长除法与移位加乘法非常相似(只是向相反方向移位并减去而不是加)