注意本文加法的思想来源于 https://blog.csdn.net/qiubingcsdn/article/details/82263114
其余为我自己做的
首先弄清楚python的字符串列表有2种取值顺序:
从左到右索引默认0开始的
s = 'ilovepython'
s[0]的结果是i
然后从右到左索引默认-1开始的
s = 'ilovepython'
s[-1]的结果是n
str=‘1000’
应该从末尾的0开始计算,为了方便首先翻转。Python可以巧妙用元组的特性。
a = a[::-1]
-
乘法可以看作每层相与之后的加法,调用加法的时候注意理清楚逻辑
首先倒序的目的只是为了逻辑上的最低位为str[0],只存在于函数的计算过程中,这样算出来的结果也是与我们直接看到的相反。因此判断是否要把这个字符串倒序只需要分为:
需要这个字符串来直接进行加减计算的/字符串直接相加而成的→倒序
这个字符串作为函数的参数/调用函数的结果→正序 -
注意变量的位置到底在哪层循环里面,局部变量容易被误清零
还有一个问题,for中的range也是一个数列,数字数列。
因此for i in range(1,5)相当于 for i in [1, 2, 3, 4]
for i in range(5)也相当于 for i in [1, 2, 3, 4]
一些细节上的小问题。建议遇到问题先谷歌翻译试图自行理解,比直接搜CSDN要快得多。 -
int()不能使用显式base转换非字符串
int() can’t convert non-string with explicit base -
b_sum = int(b[index]) ValueError: invalid literal for int() with base 10: 'b'
int()的基数为10的文字无效:
invalid literal for int() with base 10:
意思是这里的b[index]中的index出现了十进制无法识别的东西int("12345",2)
报的也是这个错误,因为这里的意思是,把【二进制数】12345强行转换成十进制,但是2345显然不是二进制数,所以这里是错误的。
-
输入的类型不能被强制转换为整型,比如输入了一个浮点型
oct() takes exactly one argument -
str对象不能直接强制爱转换成整数
‘str’ object cannot be interpreted as an integer -
字符串不可直接下标更改值,只有列表可以。
TypeError: ‘str’ object doesn’t support item deletio
我遇到的错误前情 :
八进制和十六进制只输入11110000之类的0和1是没问题的。但是出现了别的数字就不行。
出现问题的原因:
oct(x)
hex(x)
里面的参数x是十进制数字。
但是函数的返回值是带有 “0o” "0x"的字符串 !
使用前需要先转换成十进制数字!
int(a, 8) 是说明a是一个八进制数,需要被转换成十进制!这个时候,为了区分十进制和八进制,a必须要有前缀"0o"
千万不要偷懒觉得八进制不会像十六进制一样出现无法识别的ABC就直接输入了。
比如:
>>a = input("请输入第一个八进制数: ")
10
>>p = beBin(int(a))
因为输入八进制的10,实际上a=9,但是直接输入的时候,a=10
后面计算全部出错!
源代码:
def addBinary(a, b):
if len(a) < len(b): # 以长的二进制字符串为遍历起点
temp = a
a = b
b = temp
a = a[::-1] # 倒序二进制字符串
b = b[::-1]
extra = 0 # 进位
new_binary = ""
for index, num in enumerate(a): # 遍历
if index > len(b) - 1: # 判断短的二进制字符串是否越界
b_sum = 0
else:
b_sum = int(b[index])
new_binary = new_binary + str((int(num) + b_sum + extra) % 2) # 二进制加法运算
if int(num) + b_sum + extra > 1: # 是否进位
extra = 1
else:
extra = 0
if extra == 1: # 最高位是否进位
new_binary = new_binary + "1"
return new_binary[::-1] # 倒序输出
def MulBinary(a, b):
if len(a) < len(b): # 以长的二进制字符串为遍历起点
temp = a
a = b
b = temp
a = a[::-1] # 倒序二进制字符串
b = b[::-1]
Add = ""
index = 0
for num in b: # 遍历
new_binary = ""
flag = 0
for x in a:
for i in range(index):
if flag == 0:
new_binary = new_binary + "0"
flag = 1
new_binary = new_binary + str((int(num) & int(x)))
index = index + 1
new_binary = new_binary[::-1]
if index == 1:
Add = new_binary
else:
Add = addBinary(Add, new_binary) # 二进制加法运算
return Add # 倒序输出
def SudBinary(a, b):
if len(a) < len(b): # 以长的二进制字符串为遍历起点
temp = a
a = b
b = temp
a = a[::-1] # 倒序二进制字符串
b = b[::-1]
extra = 0 # 退位
new_binary = ""
for index, num in enumerate(a): # 遍历
if index > len(b) - 1: # 判断短的二进制字符串是否越界
b_sum = 0
else:
b_sum = int(b[index])
new_binary = new_binary + str((int(num) - b_sum - extra) % 2) # 二进制减法运算
if int(num) - b_sum - extra < 0: # 是否退位
extra = 1
else:
extra = 0
if new_binary[-1] == 0:
del new_binary[-1]
return new_binary[::-1] # 倒序输出
def beBin(a):
# print(a)
p = bin(a)
# print(p)
p = p.replace("0b", '')
return p
def AddOct(a, b):
p = beBin(int(a, 8))
q = beBin(int(b, 8))
t = oct(int(addBinary(p, q), 2))
return t
def AddHex(a, b):
p = beBin(int(a, 16))
q = beBin(int(b, 16))
t = hex(int(addBinary(p, q), 2))
return t
def MulOct(a, b):
p = beBin(int(a, 8))
q = beBin(int(b, 8))
t = oct(int(MulBinary(p, q), 2))
return t
def MulHex(a, b):
p = beBin(int(a, 16))
q = beBin(int(b, 16))
t = hex(int(MulBinary(p, q), 2))
return t
def SudOct(a, b):
p = beBin(int(a, 8))
q = beBin(int(b, 8))
t = oct(int(SudBinary(p, q), 2))
return t
def SudHex(a, b):
p = beBin(int(a, 16))
q = beBin(int(b, 16))
t = hex(int(SudBinary(p, q), 2))
return t
a =input("请输入第一个二进制数: ")
b =input("请输入第二个二进制数: ")
print("a+b= "+addBinary(a, b))
print("a*b="+MulBinary(a, b))
print("a-b= "+SudBinary(a, b))
a = '0o'+input("请输入第一个八进制数: ")
b = '0o'+input("请输入第二个八进制数: ")
print("输出是八进制的:")
print("a+b= "+AddOct(a, b))
print("a*b="+MulOct(a, b))
print("a-b= "+SudOct(a, b))
a = '0x'+input("请输入第一个十六进制数: ")
b = '0x'+input("请输入第二个十六进制数: ")
print("输出是十六进制的:")
print("a+b= "+AddHex(a, b))
print("a*b="+MulHex(a, b))
print("a-b= "+SudHex(a, b))