【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
n−1项的值你就必须都知道,否则
f
n
f_n
fn的值就算不出来
那我们可以从第一项开始,一直算到第
n
n
n项。
但是,每次计算的时候只会用到
i
−
1
,
i
−
2
i-1,i-2
i−1,i−2,其实我们可以只存三个数
f
i
b
i
−
1
,
f
i
b
i
−
2
,
f
i
b
i
fib_{i-1},fib_{i-2},fib_i
fibi−1,fibi−2,fibi每次都更新这三个数即可,可以做到在只保存
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函数就会这样子,之后我们在用这种方式转换进制的时候也要记得去掉。