使用列表["+",5]表示申请连续5B的内存,使用列表[2,2]表示回收位置2开始连续2B的内存。若指令集表示为:order=[["+",5],[2,2],["+",8],[8,3]]。随着指令集被执行,1024B连续的内存块会被分割成若干个占用内存和空闲内存。为方便起见,“占用内存”用1表示,“空闲内存”用0表示,故执行上述指令集后,内存占用情况如2图所示:
若将空闲块用链表组织起来,就可以快速查找空闲块和删除空闲块。把连续的空闲块定义为一个节点,每个节点由[空闲块起点, 空闲块长度, 下一个空闲块位置]三部分内容构成。根据2图内存占用情况,创建的空闲块链表如3图所示:
def linkList(allot): #linkList函数功能:根据内存占用0/1列表allot,创建空闲块链表link
link = [ [-1,-1,-1] ] #链表包含一个空头节点
head = tail = 0 ; n = len( allot ) ; i = 0
while i < n :
if allot[ i ] == 0 :
j = i + 1
while j<n and allot[ j ] == 0:
j = j + 1
link.append( [ i , j – i , -1 ] )
link[ tail ][ 2 ] = ▲
tail = len( link ) - 1
else:
i += 1
return head , link
请在▲处填入合适的代码。
若将加框处的代码修改为i = j,是否影响程序的执行结果(选填:是/否)。
#通过文件读入内存分配表allot和指令集order,其代码略。
head , link = linkList ( allot )
for i in range( len( order ) ):
if order[ i ][ 0 ] == " + ": #必须分配连续的空闲块,且由第一个满足空间大小的节点分配
p = head ; q = link[ head ][ 2 ]
while :
p = q ; q = link[ q ][ 2 ]
if q == -1:
print( "内存不足!" )
else:
if link[q][1] == order[i][1]:
else:
link[ q ][ 0 ] = link[ q ][ 0 ] + order[ i ][ 1 ]
link[ q ][ 1 ] = link[ q ][ 1 ] - order[ i ][ 1 ]
else:
p = head ; q = link[ head ][ 2 ]
while q != -1 and link[ q ][ 0 ]<order[ i ][ 0 ]:
p = q ; q = link[ q ][ 2 ]
if link[ p ][ 0 ] + link[ p ][ 1 ] == order[ i ][ 0 ]: #前面节点合并
link[ p ][ 1 ] = link[ p ][ 1 ] + order[ i ][ 1 ]
else:
link.append([ order[ i ][ 0 ] , order[ i ][ 1 ] , q]) #添加节点
link[ p ][ 2 ] = len( link ) - 1
p = link[ p ][ 2 ]
if q != -1 and : #后面节点合并
link[ p ][ 1 ] = link[ p ][ 1 ] + link[ q ][ 1 ]
link[ p ][ 2 ] = link[ q ][ 2 ]
设m=12,n=10,如图a所示,是已经预约成功的5个订单对应的各景点车上人数。当输入新的订单号:“4,5,8,”,程序提示预约不成功,如图b所示。
图a | 图b |
#定义函数,读取订单中的人数和上下车景点编号
def order(s):
num,start,end=0,0,0
j,k=0,1
for i in range(len(s)):
if ch==",":
tmp=int(s[j:i])
j=i+1
if k==1:
num=tmp
elif k==2:
start=tmp
elif k==3:
end=tmp
return num,start,end
#主程序
#读取已预约成功订单,存入列表 lst,数据元素为订单号
# 如 lst=["2,1,5,","1,3,7,","3,2,8,","2,4,7,","3,5,10,"]
n=10 #站点数
m=12 #巴士空座位总数
count=[0]*(n+1)
for i in lst: #处理预约成功订单
num,start,end=order(i)
for i in range():
count[i]+=num
s=input("请输入订单号:")#处理新订单
a,b,c=order(s)
if a*b*c!=0:
if :
print("预约不成功,请重新输入!")
else:
print("预约成功!")
else:
print("订单格式输入错误,请重新输入!")
#更新预约成功订单,再次等待新订单,代码略
图 a
图 b
图 c
编写程序:对给定的标准答案,生成并输出每道题的填涂信息,对应的选项、分值(答对得2分,答错或不答得0分),以及最后的总得分,输出结果如图c所示。请回答下列问题:
import random
n = 12 # 定义题数
da = "ABCDDABDAACA" # 存储标准答案
def check(s, w, da): # 判断得分
if :
return 2
else:
return 0
a=[[] for i in range(n)] # 存储每题 ABCD 选项的编码值
ans = [""] * n # 存储模拟生成的填涂选项
res = ""
s=""
total = 0
for i in range(n): # 模拟生成每题选项对应的 4 位编码
t = random.randint(0, 4) # 随机生成第 i+1 题的填涂情况
for j in range(4):
if :
a[i].append(1)
else:
a[i].append(0)
print("填涂卡情况:")
num=1
for i in range(n): # 打印填涂卡情况
s = s + str(a[num-1])
for j in range(4):
if a[num-1][j] == 1:
res = res + str(num) + "" + s + "
s = ""
if (i+1) % 3 == 0 :
print(res)
res = ""
num-=11
print("题号 选项 分值")
for i in range(n): # 输出每题的答案和得分
if ans[i] != " " :
df = check(ans[i], i, da)
print(f"{i+1} {ans[i]} {df}") #按格式要求输出
total += df
else:
df = 0
print(f"{i+1} 未填涂 {df}")
print(f"该学生选择题得分:{total}分")
def p(x):
for i in range(2,x):
if x%i==0:
return False
return True
执行语句 print(p(5),p(6))后,输出的结果为( )
def f(x):
for i in b:
if x==i:
return True
return False a=[2,0,9,3,10]
b=[10,9,16,2,7]
for i in a:
if f(i):
cnt+=1 print(cnt)
程序执行后的输出结果是( )
def isprime(m):
i=2
while i<=int(m**0.5):
if:
return False
i+=1
return True
for i in range(4, 1001, 2):
flag=False
for j in range(2, i):
if:
print(str(i)+"验证成功")
flag=True
break
if:
print(str(i)+"验证失败")
第一步:将经纬度转换为二进制
编码规则为:先将纬度范围(-90, 90)平分成两个区间(-90, 0)和(0, 90),如果目标维度位于前一个区间,则编码为 0,否则编码为 1,然后根据目标纬度所落的区间再平均分成两个区间进行编码,以此类推,直到精度满足要求,经度也用同样的算法。
序号 | 纬度范围 | 划分区间0 | 划分区间1 | 31.192932所属区间 |
1 | (-90,90) | (-90,0) | (0,90) | 1 |
2 | (0,90) | (0,45) | (45,90) | 0 |
3 | (0,45.0) | (0,22.5) | (22.5,45.0) | 1 |
4 | (22.5,45.0) | (22.5,33.75) | (33.75,45.0) | 0 |
5 | (22.5,33.75) | (22.5,28.125) | (28.125,33.75) | 1 |
…… | …… | …… | …… | …… |
最后得到纬度的二进制编码为:101011000101110, 用同样的方式可以得到经度(121.43737)的二进制编码:110101100101101
第二步:将经纬度的二进制编码合并,从偶数 0 开始,经度占偶数位,纬度占奇数位。经度
110101100101101,纬度 101011000101110,得到的二进制编码为:111001100111100000110011110110
偶 | 奇 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | … | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 | |
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | … | 12 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
经纬度 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | … | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
第三步:将合并后的二进制数做 Base32 编码
按照每 5 位一组,分成 6 组,每组计算其对应的十进制数值,按照 Base32 表进行编码。
11100 11001 11100 00011 00111 10110 转换成十进制是 28 25 28 3 7 22,查表编码得到最终结果,wtw37q。
林老师想编写一个 Python 程序,输入编码后的字符串,输出该编码对应的经纬度范围,运行结果如图 a 所示:
图a |
def qj(l,r,a): #将二进制 a 转成对应的经纬度范围#该代码省略
def find(c): #在 base32 表中查找对应的十进制数
for i in :
if base32[i]==c:
return i base32="0123456789bcdefghjkmnpqrstuvwxyz" s=input("请输入编码:")
res="" jd=[]
wd=[]
for i in range(len(s)):
ans=""
j=0
while:
ans=
n=n//2
j+=1
res=res+ans
for i in range(len(res)):
if i%2==0:
jd+=res[i]
else:
wd+=res[i]
print("经度对应的二进制:",jd,"纬度对应的二进制:",wd)
print("经度范围:",qj(-180,180,jd),"纬度范围:",qj(-90,90,wd))
已知斐波拉契数列1,1,2,3,5,8,1321……其定义如下:
f(a)=
求斐波拉奖数列第n项的值。
def f(n): #定义递归函数
if n==1 n==2:
return 1
else:
return
n=int(input("请输入正整数n的值:"))
print() #打印结果
实现功能:输入一个年份,输出该年份是否是闰年,是则输出“YES”,否则输出“NO”。
def rn():
if(num%400==0 or num%4==0 num%100!=0):
return "YES"
:
return "NO"
year=(input("请输入年份:"))
print()
一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1,即n!=1*2*3*...*(n-1)*n。
n!= 现求n!。
def f(n): #定义递归函数f(n)
if n==0 or n==1:
return 1 #定义当n为0时函数返回值为1
else:
return #递归定义n≥1时的通项公式
=int(input("请输入n:")) #从键盘上输入n的值
print("n!的值为:", ) #输出结果