三进制和二进制其实没啥区别
只要上一个作业用的不是特判写的题,这个题就没任何难度
d s p dsp dsp是 d i s p o s e dispose dispose的意思
########## Begin ##########
def dsp(x) :
if x == 1 :
return '1'
else :
return dsp(x // 3) + str(x % 3)
def DecToTer_int(x) :
if x < 0 :
return '-' + dsp(-x)
if x == 0 :
return 0
return dsp(x)
########## End ##########
d = int(input()) #十进制整数
t = DecToTer_int(d) #转换成三进制
print('%s -> %s' % (d, t))
这个题教我们如何处理小数,其实就是每次称一个 2 2 2
我们采用 f o r for for循环来限定次数,详情看代码
########## Begin ##########
def DecToBin_point(d) :
b = '0.'
for i in range(8) :
if d == 0 :
return b
else :
b = b + str(int(d * 2))
d = d * 2 - int(d * 2)
return b
########## End ##########
d = float(input()) #十进制纯小数
b = DecToBin_point(d) #转换成二进制
print('%s -> %s' % (d, b))
首先,我们先封装好两个东西,一个是处理整数的,一个是处理纯小数的
那么现在我们就只需要将这个二进制分解成整数和纯小数就行了
这当然是简单的,找到浮点的位置,左边就是整数右边就是小数了。
########## Begin ##########
def Bin2(d) :
l = len(d)
mdl, ret = 1, 0
for i in range(l) :
ret += mdl * eval(d[-(i + 1)])
mdl *= 2
return ret
def Bin1(d) :
l = len(d)
pos = d.index('.')
ret = Bin2(d[0 : pos])
mdl = 0.5
for i in range(pos + 1, l) :
ret += mdl * eval(d[i])
mdl /= 2
return ret
def BinToDec(d) :
if '.' in d :
return str(Bin1(d))
else :
return str(Bin2(d))
########## End ##########
b = input()
d = BinToDec(b)
print('%s -> %s' % (b, d))
但凡这种幂次之间的进制转换,满足一个进制的连续几位构成另一个进制的一位。
这个题就是,二进制的连续四位构成了十六进制的一位(因为 2 4 = 16 2^4=16 24=16)
所以,我们先把二进制的开头补上几个零,使其能构成 4 4 4的整数倍。
之后的处理就是,对于一个四位的二进制数如何变成十六进制的问题了
我们可以先把十六进制的十六个数存起来
########## Begin ##########
Hex = '0123456789ABCDEF'
def BinToHex_int(d) :
l = len(d)
d = '0' * ((4 - l % 4) % 4) + d
l, ret = len(d), ''
for i in range(l // 4) :
mdl = d[i * 4 : (i + 1) * 4]
tmp = eval(mdl[0]) * 8 + eval(mdl[1]) * 4 + eval(mdl[2]) * 2 + eval(mdl[3])
ret = ret + Hex[tmp]
return ret
########## End ##########
b = input()
h = BinToHex_int(b)
print('%s -> %s' % (b, h))
没啥好说的,注意是从大到小来判断就行
########## Begin ##########
C = 'TGMK'
def unit_convert(a) :
mdl = 1024 ** 4
for i in range(4) :
if a >= mdl :
return str(round(a / mdl, 1)) + C[i]
mdl /= 1024
return str(a)
########## End ##########
a = int(input())
b = unit_convert(a)
print('%s = %s' % (a, b))
这里,如果我们用题目中的描述来写的话会比较的麻烦,我们可以把每一种运算等价一下
比如与操作,两位都是 1 1 1才是 1 1 1等价于两位的和等于 2 2 2才是 1 1 1
或操作同理,两位都是 0 0 0才是 0 0 0等价于两位的和等于 0 0 0才是 0 0 0
异或操作就是,相同为 0 0 0不同为 1 1 1等价于两位的和等于 1 1 1才是 1 1 1
写起来就比较容易
C h a n g e Change Change函数可以看一下,其中的交换操作还是比较巧妙的
########## Begin ##########
def Change(x, y) :
l1, l2 = len(x), len(y)
if (l1 < l2) :
z = x; x = y; y = z
l3 = l1; l1 = l2; l2 = l3
y = '0' * (l1 - l2) + y
return x, y
def AND(x, y) :
x, y = Change(x, y)
l1 = len(x)
ret = ''
for i in range(l1) :
mx, my = eval(x[i]), eval(y[i])
if mx + my == 2 :
ret = ret + '1'
else :
ret = ret + '0'
return ret
def OR(x, y) :
x, y = Change(x, y)
l1 = len(x)
ret = ''
for i in range(l1):
mx, my = eval(x[i]), eval(y[i])
if mx + my == 0 :
ret = ret + '0'
else :
ret = ret + '1'
return ret
def XOR(x, y) :
x, y = Change(x, y)
l1 = len(x)
ret = ''
for i in range(l1):
mx, my = eval(x[i]), eval(y[i])
if mx + my == 1 :
ret = ret + '1'
else :
ret = ret + '0'
return ret
def NOT(x) :
l = len(x)
ret = ''
for i in range(l) :
if x[i] == '1' :
ret = ret + '0'
else :
ret = ret + '1'
return ret
########## End ##########
a = input()
b = input()
print('%s %s %s = %s' % (a, 'and', b, AND(a,b)))
print('%s %s %s = %s' % (a, 'or' , b, OR(a,b)))
print('%s %s = %s' % ( 'not', a, NOT(a)))
print('%s %s %s = %s' % (a, 'xor', b, XOR(a,b)))
要点就是设定一个 f l a g flag flag表示进位,每次做加法的时候把 f l a g flag flag也加上就行了,每算完一位更新一下 f l a g flag flag
########## Begin ##########
def Change(x, y) :
l1, l2 = len(x), len(y)
if (l1 < l2) :
z = x; x = y; y = z
l3 = l1; l1 = l2; l2 = l3
y = '0' * (l1 - l2) + y
return x, y
def add(x, y) :
x, y = Change(x, y)
l1, ret, flag = len(x), '', 0
for i in range(l1) :
mx, my = eval(x[-(i + 1)]), eval(y[-(i + 1)])
ret = str((mx + my + flag) % 2) + ret
if mx + my + flag > 1 :
flag = 1
else :
flag = 0
if flag :
ret = '1' + ret
return ret
########## End ##########
a = input()
b = input()
print('%s + %s = %s' % (a, b, add(a, b)))
这个题恶心我一晚上,我现在都不知道我最开始那份儿代码为啥是错的
这个题有几个要点:
1.转换成二进制的时候,记得用 0 0 0来补全开头,以便后续的位运算
2. s p l i t split split之后的东西是个列表,所以我们的中间变量也应该是列表
这份儿代码采用的是 P y t h o n Python Python自带的函数,非常方便
########## Begin ##########
def And(x, y) :
l = len(x)
ret = ''
for i in range(l) :
mx, my = eval(x[i]), eval(y[i])
if mx + my == 2 :
ret = ret + '1'
else :
ret = ret + '0'
return ret
def Not(x) :
l = len(x)
ret = ''
for i in range(l) :
if x[i] == '1' :
ret = ret + '0'
else :
ret = ret + '1'
return ret
def parseIP(x, y) :
X, Y = x.split('.'), y.split('.')
rt1 = ['', '', '', '']
rt2 = ['', '', '' ,'']
for i in range(4) :
mx, my = bin(eval(X[i])), bin(eval(Y[i]))
mx = mx.replace('0b', '')
my = my.replace('0b', '')
mx = (8 - len(mx)) * '0' + mx
my = (8 - len(my)) * '0' + my
#print(mx, my, Not(my))
rt1[i] = str(int(And(mx, my), 2))
rt2[i] = str(int(And(mx, Not(my)), 2))
#print(rt1[i], rt2[i])
return '.'.join(rt1), '.'.join(rt2)
########## End ##########
ip = input() #IP地址
mask = input() #子网掩码
netID, hostID = parseIP(ip, mask)
print('网络号:', netID) #网络号
print('主机号:', hostID) #主机号