内容正文:
高效作业12[第12课 程序强化——进制转换]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
【A级 新教材落实与巩固】
1.有如下Python程序段:
code=”0123456789ABCDEF”
numstr=input(”请输入一个二进制整数: ”)
numlen=len(numstr)
s=0
ss=””
for i in range(numlen):
x=int(numstr[i])*2**(numlen-i-1)
s+=x
t=s
while t>0:
ss=code[t%16]+ss
t=t//16
print(s)
若输入的值为“1100111”,则执行该程序段后,输出的结果是( )
A.110 B.103
C.67 D.1100111
【解析】 for循环将二进制数转换成十进制数,while循环将十进制数转换成十六进制数,选项B正确。
B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2.有如下Python程序段:
m=int(input())
s=””
flag=True
while m>0:
r=m%10
m=m//10
5
if flag and r%2!=0:
s=str(r)+s
flag=not flag
print(flag,s)
若输入的值为“5201314”,则执行该程序段后,输出的结果是( )
A.False 1 B.True 1
C.False 2 D.True 4
A
【解析】 执行过程如下,选项A正确。
m 520131 52013 5201 520 52 5 0
r 4 1 3 1 0 2 5
flag True False False False False False False
s ”” ”1” ”1” ”1” ”1” ”1” ”1”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3.针对选考有如下Python 程序段:
def trans(m,n):
if m!=0:
r=m%n
return trans(m//n,n)+str(r)
else:
return ”0”
a=int(input(”a=”))
b=int(input(”b=”))
print(trans(a,b))
若依次输入11 和2,则执行该程序段后,输出的结果是( )
A.1011 B.1101
C.01011 D.11010
C
项目 trans
(11,2) trans(5,2) trans(2,2) trans(1,2) trans
(0,2)
返回值 trans(5,2)+”1” trans(2,2)+”11” trans(1,2)+”011” trans(0,2)+”1011” ”01011”
【解析】 执行过程如下,选项C正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4.针对选考有如下Python 程序段:
n=0
for i in range(128,256):
k=i
t=0
while k>0:
t+=k%2
11
k//=2
if t==5:
n+=1
print(n)
执行该程序段后,输出的结果是( )
A.24 B.35
C.20 D.56
B
【解析】 将128(含)到255(含)之间的十进制数转换成二进制数,并判断是否含有5个1,如果有,则计数器n+1。即最高位肯定为1,则判断7个位置中有4个1的情况有几种,C47=35,选项B正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
5.针对选考有如下Python程序段,功能为:将x个苹果装进若干个箱子里,第一个箱子装1个,第二个箱子装2个……第k个箱子装2k-1个。若小明从中取走m个箱子,计算他共可取走多少个苹果。
#输入x和m的值,代码略
t=0
for i in range(1,x+1):
temp=i
while temp!= 0:
14
上述程序段中加框处可选的代码有:
①temp%2==0 ②temp%2==1 ③t==m ④t==m+1
下列选项中,代码顺序正确的是( )
A.①④ B.②④
C.②③ D.①③
【解析】 最外层for循环从1遍历到x,可以理解为每次取的苹果数量可以是1~x个,但由于每个箱子里的苹果是按照20,21,22,23,…,2k的数量规律装箱的,所以每次取走的苹果个数并不是1~x的连续整数。每个箱子中的苹果数量转换为二进制后只含有一个“1”,取m个箱子,可能的苹果总数转为二进制后含有m个“1”。
C
以苹果数量x=31为例,遍历1~31,分别转换为二进制数,即二进制数为00001、00010、00011、……、11110、11111,取出的苹果数量为1、2、3、……、30、31,如果取走两个箱子(m=2),满足条件的方案为:00011、00101、……、11000,即五位二进制数中存在两个“1”,总方案个数为C(5,2)=10。第一个空判断temp的对应的二进制位上是否为1,如果是1,则增加1个箱子;第二个空,如果箱子数刚好是m,则i是可能的苹果个数,进行输出。故选项C正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
6.针对选考有如下Python 程序段:
a=[0]*4
for i in range(5):
j=0
a[j]+=1
while a[j]==2:
a[j]=0
j+=1
a[j]+=1
print(a)
执行该程序段后,输出的结果是( )
A.[1,1,0,0] B.[1,0,1,0]
C.[0,1,1,0] D.[0,1,0,1]
【解析】 程序实现了将十进制数转换成二进制数,5D=0101B,存储时a[0]存储低位,选项B正确。
B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
7.编写Python程序,功能为:输入一个十进制数,执行程序后,输出其对应的十六进制数。程序运行界面如图所示:
实现上述功能的Python程序段如下:
x=input('请输入待转换的十进制数: ')
t=①___________
s=''
while t>0:
int(x)
20
r=②_____________
t//=16
if r>9:
a=chr(r+55)
else:
a=str(r)
s=③__________
t%16
a+s
print('转换后的十六进制数为: ',s)
请回答下列问题。
(1)若键盘输入65,则执行该程序段后,输出的值为_______。
(2)请在横线处填入合适的代码。
【解析】 (1)65对应的十六进制数为41。
(2)十进制转十六进制的方法是除以十六倒取余数。①处t%16实现对16取余数,②处s=a+s实现将余数倒序连接。
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
8.将k(k<=10)进制数x转换为十进制数。编写Python程序实现如下功能:键盘依次输入进制数k和待转换的数x,执行程序后,输出转换后的十进制数。程序运行界面如图所示:
实现上述功能的Python程序段如下:
k=int(input('请输入进制数k: '))
x=input('请输入待转换的数值: ')
s=0;i=0
while ①______________:
i<len(x)
t=int(x[i])
s=②__________________________________
③_______________
print(k,'进制数',x,'转换为十进制数为: ',s)
请回答下列问题。
(1)若进制数k为2,待转换的数为101101,则进制转换后的值为______。
(2)请在横线处填入合适的代码。
s*k+t或s+t*k**(len(x)-1-i)
i=i+1
45
(3)若进制数k为7,待转换的数为26,则执行该程序段后,输出的结果是
_______________________________________。
【解析】 (1)将二进制数“101101”利用按权相加的方式转换为十进制数:25+23+22+20=45。
(2)①从左向右按位读取k进制数,i==len(x)时,读取完成。
②由高位开始读取可以采用s*k+t,也可以按权累加完成s+t*k**(len(x)-1-i)),以八进制数37521为例:
七进制数26转换成十进制数为:20
4 3 2 1 0
3 7 5 2 1
当i=0时,需要得到系数4,len(x)-1-i=5-1-0,以此类推。
③循环变量i后移。
(3)将七进制数“26”利用按权相加的方式转换为十进制数:2×7+6=20。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
9.2024·仙居中学检测十进制数转换为k进制数(k介于2和16之间)。设计程序实现如下功能:依次输入十进制数d和进制数k,执行程序后,将十进制数转换为k进制数并输出。程序运行界面如图所示:
实现上述功能的Python程序段如下:
m='ABCDEF'
d=int(input('请输入十进制数: '))
k=int(input('请输入进制数k: '))
s=''
while ①_____________:
r=d%k
if r>9:
c=②_______________
else:
c=str(r)
s=c+s
d=③__________
①d>0
m[r-10]
d//k
print('结果为: ',s)
请回答下列问题。
(1)请在横线处填入合适的代码。
(2)若输入十进制数为38,输入进制数为2,执行该程序段后,输出的结果是____________。
【解析】 (1)将十进制数转换成k进制数的方法:除以k倒取余数。①当d==0时,表示已转换完成。②当余数大于9时,需顺序对应ABCDEF。以A为例,数值为10,下标对应为0。③将d更新。
100110
(2)十进制数38,输入进制数2,并逆序连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
10.编写一个Python程序,把输入的十进制数转换为二进制数,并判断二进制数中的“0”和“1”的数量是否相等。程序功能实现如下:输入待转换的十进制数x,执行程序后,输出转换后的二进制数,并输出“相等”或“不相等”。程序运行界面如图所示:
请回答下列问题。
(1)若输入十进制数为52,其转换后的二进制数为_____________,其中“0”和“1”的数量________(选填:相等/不相等)。
(2)实现上述功能的Python程序段如下,请在横线处填入合适的代码。
110100
相等
c0=0;c1=0
s=''
x=int(input('请输入十进制数: '))
while x>0:
y=①___________
if y==0:
②____________
x%2
c0+=1
else:
c1+=1
s=③_____________
x//=2
print('二进制数为: ',s)
if ④____________:
print('相等')
str(y)+s
c0==c1
else:
print('不相等')
【解析】 (1)除以2倒取余数,得到二进制数110100。
(2)除以2倒取余数,y中存放余数,s中存放转换后的二进制数并倒序存入,存入前需对y进行数据类型转换。c0存储0的个数;c1存储1的个数。
①获取余数。
②如果余数为0,则c0的值+1。 ③将余数倒序连接。
④判断0和1的个数是否相等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
【B级 素养形成与评价】
11.现有如下Python程序段,实现如下功能:键盘输入十进制数后,输出对应的二、八、十六进制数。运行界面如图所示:
实现上述功能的Python程序段如下,请在横线
处填入合适的代码。
def chg10(n,m):
x='0123456789ABCDEF'
temp=''
k=n
while ①_________:
p=k%m
temp=②______________
k//=m
return temp
a=int(input('请输入待转换的数: '))
k>0
x[p]+temp
print('转换为二进制数: ',chg10(a,2))
print('转换为八进制数: ',③___________________
print('转换为十六进制数: ',chg10(a,16))
【解析】 该程序通过调用进制转换函数chg10(n,m),来实现相应数值转换。其中自定义函数通过除以m倒取余数的方法实现进制转换。
①当k==0时,表示已经转换完成。②在字符串x中找到相应的字符,并逆序连接。③将余数倒序架接。④调用函数实现十进制数转换成八进制数。
chg10(a,8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
12.2024·龙泉一中检测编写一个Python程序,实现如下功能:输入一个十六进制数(注:包含小数),执行该程序后,输出该数对应的十进制数。程序运行结果如图所示:
请回答下列问题。
(1)若输入十六进制数为“A.8”,其转换后的十进制数为___________。
(2)实现上述功能的Python程序段如下,请在横线处填入合适的代码。
x=input('请输入十六进制数: ')
①__________________
n=len(x)
38
i=0
count=0;s=0
while i<n :
if x[i]==' .':
break
②_______________
m=i #小数点下标
i+=1
for ③___________:
if '0'<=i<='9':
y=int(i)
if 'A'<=i<='F':
y=④____________________________________
if count<m: #整数部分
s=⑤__________________________________
i in x
ord(i)-55或ord(i)-ord('A')+10
s+y*16**(m-count-1)或s*16+y
if count>m: #小数部分
s=s+y*16**(m-count)
count+=1
print('对应的十进制数: ',s,'D')
【解析】 (1)A.8H=10×160+8×16-1=10.5D。
(2)包含小数点的进制转换,小数部分也是位权展开相加。该题程序思想是找到小数点位置,整数部分与小数部分的权值计算公式不同,分别按照位权展开相加。
①获取字符串的长度。
②利用while循环找到小数点位置,循环变量后移。
③获取字符串中的每个字符。
④将A~F转换成10~15。
⑤将整数部分按权相加转换为十进制数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
13.“二进制数加法”程序实现如下功能:键盘分别输入两个二进制数b1和b2,执行该程序后,输出两个二进制数相加的结果。程序运行界面如下:
请回答下列问题。
(1)若输入的两个二进制数分别是“1001”和“101”,则两数之和为___________。
(2)实现上述功能的Python程序段如下,请在横线处填入合适的代码。
b1=input('请输入二进制数b1: ')
1110
b2=input('请输入二进制数b2: ')
ans=''
dist=len(b1)-len(b2)
if dist<0:
①___________________ #b1中存放位数较多的数
for i in range(dist):
b2='0'+b2
b1,b2=b2,b1
jw=0
for i in range(len(b1),0,-1):
x=int(b1[i-1])+int(b2[i-1])+jw
jw=②________
ans=③_______________+ans
if ④______________:
ans='1'+ans
print(b1,'+',b2,'=',ans)
x//2
str(x%2)
jw==1
【解析】 (1)二进制数相加,逢2进1。
1 0 0 1
+__1__0__1
1 1 1 0
(2)① b1、b2进行交换,b1中存放位数较多的数。② jw存放进位信息,如果相加值x大于2,则进位,逢2进1,故x//2。③相加从低位开始,原位留取余数,逆序连接。④如果最后有进位,则在结果前连上字符“1”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
14.在计算机系统中,数值一律用补码来表示和存储。求负整数(-127~-1)的补码是将该数对应的正整数转换为二进制数(不足8 位时高位补0),最高位作为符号位为1,其余每位二进制数取反(1 变成0,0 变成1),末位加1。小明编写了Python 程序,实现求负整数的补码。程序运行界面如图所示:
请回答下列问题。
(1)根据题意,-18 的补码为 ___________。
(2)实现上述功能的Python程序段如下,请在横线处填入合适的代码。
11101110
47
n=input(”请输入一个负整数: ”)
num=①__________________________
a=[0] *8
for i in range(7,0,-1):
a[i]=②_____________________________ #求反码
num=num//2
a[0],i=1,7
abs(int(n))或其他等价答案
(num+1)%2或其他等价答案
a[i]=a[i]+1 #末位加1
while ____________________________and i>0:
a[i]=0
④_______________________
i-=1
s=””
for i in a:
③a[i]==2或其他等价答案
a[i-1]=a[i-1]+1
s=s+str(i)
print(s)
【解析】 (1)先将18转换为8位二进制数10010010,再求反码11101101,末位加1,结果为11101110。
(2)算法思想,先将负整数转换为正整数,再转换为二进制数(除以2取余法),其中在转换过程中实现每位的反相;while循环实现末尾加1的进位操作(逢二进一)。
①将输入的值转换为正整数。
②除以2取余的同时,求出反码。
③while循环实现末尾加1的进位操作(逢二进一),当a[i]的值达到2,则需要进位。
④从低位开始加1,当i位满足进位要求,则前一位i-1上的值,需要加1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
15.现有一小块矿石,质量不超过200 g,现用托盘天平来称重,已知砝码有50 g,20 g,10 g,5 g,2 g,1 g共6 种规格,每种规格的砝码数量均满足需求,游码置于标尺零刻度位置且无须拨动,将该矿石放至托盘天平左盘,不断往右盘加砝码(注:先大后小),直至平衡。根据输入的矿石质量(注:只考虑正整数),输出平衡时所需的各规格砝码数量。程序代码和测试效果如图所示:
实现上述功能的Python程序段如下:
m=int(input(”请输入矿石质量: ”))
w=[50,20,10,5,2,1] #砝码规格
n=[0]*6
s=”所需的砝码: ”
①_________
while m>0:
n[i]=m//w[i]
m=②______________________________
i=0
m-w[i]*n[i] 或m%w[i]
i+=1
if n[k]>0:
s=s+str(w[k])+”g: ”+str(n[k])+”个; ”
print(③____________________
请回答下列问题。
(1)请在横线处填入合适的代码。
(2)上述程序段中加框处代码有误,请改正:_____________。
s[:-1]+”。”)
range(6)
【解析】 (1)利用十进制数转换成其他进制数的方式,实现砝码的选择,从最大的砝码开始选择。
①i是列表w的下标(索引),从0开始(从最大的砝码开始选择)。
②n[i]为砝码的w[i]的个数,所以需要减去这几个砝码的重量。
③在输出的最后加上句号。
(2)range的语法,使用()。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
16.2024·东海中学检测小红学习了数的进制后,思考用Python编程来解决一个问题:读入一个整数n,随机产生n位由0和1组成的二进制数字字符串,将其转换为十六进制数。程序运行界面如图所示:
实现上述功能的Python程序段如下:
import random
t={0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'A',11:'B',12:'C',13:'D',14:'E',15:'F'}
def btoh(m):#把二进制数m转换成十六进制数,m为字符串型
d=0
for i in range(4):
① ________________________________________________________
_________________
h=t[d]
return h
n=int(input(”请输入整数n: ”))
s=””
①d=d*2+int(m[i]) 或d+=int(m[i])*2**(3-i)或d=d+
int(m[i])*2**(3-i)
for i in range(n):#随机产生n位由0和1组成的二进制数字字符串
s=s+str(x)
print(”生成二进制数: ”+s)
c=n%4
if c!=0:#二进制数字字符串前补若干个”0”,保证该字符串的长度为4的倍数
for i in range(4-c):
s=”0”+s
h=””
for i in range(0,len(s),4):#每4位二进制数转换成1位十六进制数
b=s[i:i+4]
h=h+②_______________
print(”对应十六进制数: ”+h)
请回答下列问题。
btoh(b)
(1)请在横线处填入合适的代码。
(2)上述程序段中加框处代码有误,请改正:
_________________________________。
【解析】 (1)程序思维,将二进制数转换成十六进制数;首先产生n位二进制数;“if c!=0:”结构实现将二进制数的位数补齐为4的倍数;从左向右以每4位一组分别转换成十六进制数;函数实现将二进制数转换成十六进制数,首先转换成十进制数(按权相加方式)。
①将每4位二进制数转换成十进制数。
randint(0,1)或choice(range(2)
②调用函数将二进制数转换成十六进制数。
(2)二进制数中没有2,所以改为random(0,1)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
17.针对选考 2024·衢州二中检测有一种ASCII字符加密的算法,其加密过程如下:
①将明码中每个字符的ASCII码转为8位二进制数,依次连接;
②位置加密:每4位一组进行移位,第1组左移一位,并将原第一位数码移至最后(如0110转换为1100),第2组右移一位,并将原最后一位数码移至头部(如0001转换为1000),第3组左移……以此类推,实现位置加密,并将每组移动后的结果转换成十进制数,按顺序连接;
③值加密:随机产生一个密钥key,在符号列表['+','*','//','%']中取
出对应运算符号,将②中的十进制结果分别与密钥key进行运算,顺次连接求得该字符的密文,(如key为3,取得运算符'%',则字符'a'的高位密文为12%3=0,低位密文为8%3=2,顺次连接后得'a'的密文为'02';
④将每个字符的密文顺序连接,得到最终字符串的密文。
程序运行结果如图所示:
实现上述功能的Python程序段如下:
import random
def jzzh(x):
s=''
for i in range(8):
r=x%2
s=①______________
str(r)+s
x=x//2
return s
def jisuan(x): #进行key运算
m=0
if fh[key]=='+':
m=x+key
elif fh[key]=='*':
m=x*key
elif fh[key]=='//':
m=x//key
elif fh[key]=='%':
m=x%key
return m
def yidong(x):
jg=''
n=len(x)//4
for i in range(n):
if i%2==0:
f=②_______________________________
else:
f=x[i*4+3]+x[i*4:i*4+3]
x[i*4+1:(i+1)*4]+x[i*4]
s=0
for j in f: #将4位二进制数转换成十进制数
s=s*2+int(j)
jg+=③_________________
return jg
mingw=input('请输入要加密的明文: ')
fh=['+','*','//','%']
str(jisuan(s))
miw=''
global key
key=random.randint(0,3)
for a in mingw:
a=ord(a)
L=jzzh(a)
miw+=L
jieguo=yidong(miw)
print(”产生的随机密钥为: ”,key,”
密文为: ”,jieguo)
请回答下列问题。
(1)若key=3,输入要加密的明文:”aA”,则输出的密文为:________。
(2)请在横线处填入合适的代码。
【解析】 (1)由题干描述可知”a”的密文为02;”A”转换成二进制数0100 0001,按第②步转换成1000 1000,按第③步8%3后,密文为22,答案为0222。
0222
(2)①jzzh()函数将十进制数转换成二进制数,将余数逆序连接到s中。yidong()函数将每4位二进制数进行移位,并转换成十进制数,再利用jisuan()函数,转换为密文。②若i%2==0成立,左移;③调用jisuan()函数,转换为密文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
18.小江编写Python 程序完成不同进制的加法运算。输入一个由二进制、十进制或十六进制组成的加法式子,求出这个加法式子的和(用十进制表示)。加法式子的形式为“A2H+1101B=”。程序运行界面如图所示:
实现上述功能的程序如下:
def xtod(s,m):#将m 进制数s 转换为十进制数
n=len(s);y=0
for k in range(0,n):
ch3=s[k]
x=ord(ch3)-55
else:
x=int(ch3)
y=①____________
return y
s1=input(”请输入式子: ”)
i=0;ans=0
y*m+x
dic={”B”:2,”D”:10,”H”:16}
for j in range(0,len(s1)):
ch1=s1[j]
ch2=s1[j-1]
if ch1==”+” or ch1==”=”:
s2=s1[i:j-1]
ans=②____________________________
ans+xtod(s2,dic[ch2])
③________________
print(”运算结果为: ”+str(ans)+”D”)
请回答下列问题。
(1)若输入的加法式子为“1BH+10B+65D”,则它们的和(十进制数)为
_______________。
(2)请在横线处填入合适的代码。
i=j+1
29或29D
【解析】 (1)1BH=27D,10B=2D,由于需要遇到“+”或“=”,才能累加,所以最后一组数字不会累加。
(2)ch1用于存储运算符,当遇到运算符时,提取前一组数据,s1[i:j-1],i为开始位置,j为运算符所在位置,前两个位置是结束位置;②调用函数转换成十进制数,并累加,需要传递s2和进制;③是更新新一组数据的开始;①xtod()函数将m 进制数s 转换成十进制数。
感谢聆听,再见!
if :
t=t+1
temp//=2
if :
print(i)
t=0
for k in :
x=random.
$$