【Educoder作业】不择手段星人的解析IP地址【问题求解-进制-第8关】
·
# 与函数代码【直接从前面搬】
def AND(a, b):
s1 = ''
for i in range(len(a)):
if a[i] == '1' and b[i] == '1':
s1 = s1 + '1'
else:
s1 = s1 + '0'
return s1
# 非函数代码【还是从前面搬的】
def NOT(a):
s3 = ''
for i in range(len(a)):
if a[i] == '1':
s3 = s3 + '0'
else:
s3 = s3 + '1'
return s3
# 二进制换十进制代码【还是从前面搬的,甚至是能转换小数的高级版本!】
# 因为我实在是弄不清楚python内置二进制换十进制是什么要求了...(欢迎评论告诉我!)
def BinToDec(x):
s = 0
if '.' not in x:
for i in range(len(x)):
if x[i] == '1':
s = s + 2**(len(x)-i-1)
return s
elif '.' in x:
if float(x) > 1:
a = x.index('.')
for i in range(a):
if x[i] == '1':
s += 2**(a-i-1)
for j in range(a+1, len(x)):
if x[j] == '1':
s += 2**((-1)*(j-a))
elif float(x) < 1:
for i in range(2, len(x)):
if x[i] == '1':
s += 2**((-1)*(i-1))
return s
# 使用了python内置的进制转换函数bin,顺便把分段的二进制数位用0补齐
# 这里的一个易错点是:二进制和十进制都是八位一组(不足八位补齐),不是一个整体数字
def turn(L):
s = []
for i in range(len(L)):
ai = bin(int(L[i]))
bi = ai.replace('0b', '')
s.append(bi)
s1 = []
for j in range(len(s)):
if len(s[j]) < 8:
k = '0'*(8-len(s[j])) + s[j]
s1.append(k)
elif len(s[j]) == 8:
k = s[j]
s1.append(k)
return s1
# 关于这个函数要实现的功能:
# 把一个列表里的二进制字符串改为十进制
# 其实完全可以跟前面的封装到一起
def turn_(L):
s = []
for i in range(len(L)):
ai = BinToDec(L[i])
s.append(ai)
return s
def parseIP(ip, mask):
IP = ip.split('.')
MASK = mask.split('.')
# 这是两个把输入分好段的列表
ip1 = turn(IP)
mask1 = turn(MASK)
# ip1和mask1是两个二进制分段的列表
c_bin = []
d_bin = []
for i in range(len(ip1)):
ci = AND(ip1[i], mask1[i])
di = AND(ip1[i], NOT(mask1[i]))
c_bin.append(ci)
d_bin.append(di)
# 这是两个运算后的二进制列表
c_ans = turn_(c_bin)
d_ans = turn_(d_bin)
# 终于搞到答案了!以下是最终的输出步骤。
c = ''
d = ''
for i in range(len(c_ans)-1):
c = c + str(c_ans[i]) + '.'
d = d + str(d_ans[i]) + '.'
# 《关于不让for循环在最后点点这件事》
for i in range(len(c_ans)-1, len(c_ans)):
c = c + str(c_ans[i])
d = d + str(d_ans[i])
return c
代码行数有点多,可能比较繁杂。希望大家在评论区里多分享自己的观点,一起学习,共同进步!悄悄白嫖地不要!
更多推荐



所有评论(0)