【Educoder作业】问题求解——进制

【Educoder作业】问题求解——进制

T1 前苏联的黑科技

三进制和二进制其实没啥区别
只要上一个作业用的不是特判写的题,这个题就没任何难度
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))

T2 乘二取整

这个题教我们如何处理小数,其实就是每次称一个 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))

T3 二进制到十进制

首先,我们先封装好两个东西,一个是处理整数的,一个是处理纯小数的
那么现在我们就只需要将这个二进制分解成整数和纯小数就行了
这当然是简单的,找到浮点的位置,左边就是整数右边就是小数了。

########## 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))

T4 二进制到十六进制

但凡这种幂次之间的进制转换,满足一个进制的连续几位构成另一个进制的一位。
这个题就是,二进制的连续四位构成了十六进制的一位(因为 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))

T5 二进制计量单位

没啥好说的,注意是从大到小来判断就行

########## 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))

T6 逻辑运算

这里,如果我们用题目中的描述来写的话会比较的麻烦,我们可以把每一种运算等价一下
比如与操作,两位都是 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)))

T7 二进制加法

要点就是设定一个 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)))

T8 解析 IP 地址

这个题恶心我一晚上,我现在都不知道我最开始那份儿代码为啥是错的
这个题有几个要点:
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)  #主机号

你可能感兴趣的:(Educoder作业,python)