【Educoder作业】※ 数值信息——除二取余

【Educoder作业】※ 数值信息——除二取余

好久没更了,主要是五一放假小摆一波

T1 准备工作:字符串

在这里插入图片描述
在这里插入图片描述
这些是字符串的基本操作,需要注明的一点是:
字符串本身并不支持单点修改,切记切记
这个题就是基础应用了

ID = input()                #ID表示学号
########## Begin ##########
if len(ID) != 8:                       #如果学号不是8位
    print('不是8位')
if ID.startswith('20') == False:                       #如果学号未以20开头
    print('未以20开头')
if ID[2 : 4] != '18' and ID[2 : 4] != '19' and ID[2 : 4] != '20':                       #如果学号3、4位不正确
    print('第3、4位不正确')
for i in ID:                      #对于学号中的每一位x
    if (i in '0123456789') == False :                  #如果x不是数字字符
        print(i, '不是数字')
########## End ##########
print('检查完成')

T2 实现除二取余方法

在进制转换中,我们需要频繁的使用 s t r str str函数和 e v a l eval eval函数,前者用来将数字变成字符串,后者来得到字符串中的值。
我们往往用 i n t int int来保存十进制,其余所有进制一律用 s t r i n g string string

########## Begin ##########
def DecToBin_int(d) :
    b = ''
    while d :
        b = str(d % 2) + b
        d = d // 2
    return b
########## End ##########
d = int(input())
print(DecToBin_int(d))

T3 改进程序

这种处理负数的,我们中心思想可以总结为两步:变成正数需要的,处理正数到负数之间需要的。
这个题当然是容易的,如果是负数就是变成正数处理好了之后加个负号即可。

########## Begin ##########
def DecToBin_int(d) :
    b = ''
    while d :
        b = str(d % 2) + b
        d = d // 2
    return b
def Dispose(x) :
    if x > 0 :
        return DecToBin_int(x)
    elif x == 0 :
        return 0
    else :
        return '-' + DecToBin_int(-x)
########## End ##########
d = int(input())
print(Dispose(d))

T4 递归函数

有点莫名其妙,突然就变成递归了

########## Begin ##########
def F(x) :
    if x == 1 or x == 2 :
        return 1
    else :
        return F(x - 1) + F(x - 2)
########## End ##########
n = int(input())
print(F(n))

T5 算法复杂度

这个题的想法是精彩的,我们也就顺便聊几句
空间换时间是容易理解的,就是把东西存起来,以此来节省重复计算需要的时间。就像这个题一样,我们搞一个数组,如果他被计算过,我们就是直接访问;如果没被计算过,就计算它。
那么有没有时间换空间呢?其实就是上面过程的逆过程,有些东西存起来太大了,但是算起来又比较容易,我们就每次用的时候重新算。
回到这个题。
我们理解了空间换时间之后,题目里的数组真的有必要吗?
你会发现,如果想计算 f i b n fib_n fibn,前 n − 1 n-1 n1项的值你就必须都知道,否则 f n f_n fn的值就算不出来
那我们可以从第一项开始,一直算到第 n n n项。
但是,每次计算的时候只会用到 i − 1 , i − 2 i-1,i-2 i1,i2,其实我们可以只存三个数 f i b i − 1 , f i b i − 2 , f i b i fib_{i-1},fib_{i-2},fib_i fibi1fibi2fibi每次都更新这三个数即可,可以做到在只保存 3 3 3个数的情况下完成 O ( n ) O(n) O(n)时间内计算 f i b n fib_n fibn,具体的代码实现就交给读者了。

cache = [1, 1]  #用于存储已算出的项,第i号元素对应第i+1项,最开始时存放了第1、2项
def F(n): 
    if len(cache)>=n:      #先到列表中查询,若列表中包含了F(n)
        return cache[n-1]  #则直接返回F(n)
    else:                  #否则计算F(n)
        Fn = F(n-1)+F(n-2) #计算F(n)的方法与之前相同
        cache.append(Fn)   #将计算结果存入列表,以便后续直接使用
        return Fn          #返回计算结果

n = int(input())
print(F(n))

T6 除二取余方法的递归实现

没啥好说的,一个递归就行

########## Begin ##########
def f(x) :
    if x == 1:
        return '1'
    else :
        return f(x // 2) + str(x % 2)
########## End ##########
d = int(input())
print(f(d))

T7 递归程序的改进

跟上面那对儿一样,就是加一个处理负数和零

def f(d):
    if d==1:
        return '1'
    else:
        return f(d//2)+str(d%2)
########## Begin ##########
def DecToBin_int(x) :
    if x < 0 :
        return '-' + f(-x)
    if x == 0 :
        return '0'
    return f(x)
########## End ##########
d = int(input())
print(DecToBin_int(d))

T8 Python对进制转换的支持

这个题其实就是 P y t h o n Python Python的强大之处。它会把你可能用到的所有函数都封装好,这就是典型的空间换时间

d = int(input())
########## Begin ##########
b = bin(d)
b = b.replace('0b', '')
########## End ##########
print(b)

这个 0 b 0b 0b不是偶然现象,只要使用这个 b i n bin bin函数就会这样子,之后我们在用这种方式转换进制的时候也要记得去掉。

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值