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

该博客介绍了多种进制转换方法,包括从十进制到三进制、二进制到十进制、二进制到十六进制的转换,并涉及乘二取整和二进制计量单位的计算。此外,还讲解了逻辑运算,如与、或、异或及非运算的实现。同时,展示了如何解析IP地址和子网掩码进行网络号和主机号的计算。
摘要由CSDN通过智能技术生成

【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)  #主机号

  • 41
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
问题求解——while循环这个任务中,我们需要计算三个正整数的最小公倍数。首先,我们需要输入三个正整数a、b和c。然后,我们使用一个while循环来递增地尝试一个数d,直到找到一个数d,它同时是a、b和c的倍数。当找到这样一个数时,我们打印出它,并且使用break语句跳出循环。在循环之前,我们先将d初始化为a。接下来,我们可以按照以下步骤进行编程: 1. 输入三个正整数a、b和c。 2. 使用一个while循环,初始化变量d为a。 3. 在循环中,使用条件判断语句if来检查d是否同时是a、b和c的倍数。 4. 如果是,打印出d,并且使用break语句跳出循环。 5. 如果不是,将d递增1,继续下一次循环。 6. 在循环结束后,程序会打印出三个正整数a、b和c的最小公倍数。 请注意,在编程过程中,我们需要确保a、b和c的值都是正整数,并且不为0,以确保计算的准确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Educoder作业问题求解——while 循环](https://blog.csdn.net/JZYshuraK/article/details/124331206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [问题求解——while 循环](https://blog.csdn.net/Junds0/article/details/122455406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值