内容正文:
第12课 程序强化——进制转换(见学生用书P57)
——3.3 简单算法及其程序实现,教材第97~100页
掌握进制转换的基本思路,并能用程序实现。
1.十进制转k进制程序代码
除以k倒取余数,将输入的十进制数不断除以k取余直至商为零,并将余数以下标形式借助数码字符串转换成对应字符串型数值
除以k倒取余数,将输入的十进制数不断除以k取余直至商为零,并将余数通过数据类型转换函数转换成对应字符串型数值
code='0123456789ABCDEF'
s=”
n=int(input('请输入待转换的值: '))
k=int(input('请输入进制数: '))
while n>0:
r=n%k
n=n//k
s1=code[r]
s=s1+s
print('转换后的值为: ',s)
s=”
n=int(input('请输入待转换的值: '))
k=int(input('请输入进制数: '))
while n>0:
r=n%k
n=n//k
if 0<=r<=9:
s1=str(r)
else:
s1=chr(r+55)
s=s1+s
print('转换后的值为: ',s)
2.二进制转十进制程序代码
位权展开相加,对输入的二进制字符串中的元素依次顺序遍历,并乘该数值对应的位权,累加得到十进制数
位权展开相加,对输入的二进制字符串中的元素依次逆序遍历,并乘该数值对应的位权,累加得到十进制数
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(0,n,1):
ch=s[i]
sum=sum+int(ch)*2**(n-1-i)
print(sum)
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(n-1,-1,-1):
ch=s[i]
sum=sum+int(ch)*2**(n-1-i)
print(sum)
移位思想,对输入的二进制字符串中的元素依次顺序遍历,使用累乘相加,得到十进制数
移位思想,对输入的二进制字符串中的元素依次逆序遍历,使用累乘相加,得到十进制数
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(0,n,1):
ch=s[i]
sum=sum*2+int(ch)
print(sum)
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(n-1,-1,-1):
ch=s[n-1-i]
sum=sum*2+int(ch)
print(sum)
3.十六进制转十进制程序代码
位权展开相加,对输入的十六进制字符串中的元素依次顺序遍历,转换成对应数值,并乘该数值对应的位权,累加得到十进制数
移位思想,对输入的十六进制字符串中的元素依次顺序遍历,使用累乘相加,得到十进制数
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(0,n,1):
ch=s[i]
if 'A'<=ch<='F':
x=ord(ch)-55
else:
x=int(ch)
sum=sum+x*16**(n-1-i)
print(sum)
s=input('请输入待转换的值: ')
n=len(s)
sum=0
for i in range(0,n,1):
ch=s[i]
if 'A'<=ch<='F':
x=ord(ch)-55
else:
x=ord(ch)-48
sum=sum*16+x
print(sum)
4.二进制转十六进制代码
将输入的二进制字符串中的每四位二进制数以位权展开相加的方法转换为十进制数,再对应转换为十六进制的数码,实现进制转换
m=0;k=0;sum=”
s=input('请输入待转换的值: ')
n=len(s)
for i in range(-1,-n-1,-1):
ch=s[i]
m=m+int(ch)*2**k
k+=1
if k==4:
if m>=10:
f=chr(m+55)
else:
f=chr(m+48)
sum=f+sum
k=0
m=0
if m>0:
sum=str(m)+sum
print(sum)
键盘输入十进制数,将其转换为二进制数后输出。实现该功能的Python程序段如下:
s=””
x=int(input())
while x>0:
print(s)
上述程序段中加框处的代码由以下三部分组成:
①x=x//2 ②s=str(t)+s ③t=x%2
下列选项中,代码顺序正确的是( C )
A.②①③ B.①③② C.③②① D.①②③
【解析】 十进制数转换成二进制数的方法是除以2倒取余数。在循环体中,不断取余,倒序拼接,最后整除2,选项C正确。
变式1 有如下Python程序段:
code='0123456789ABCDEF'
s=”
n=58
k=16
while n>0:
r=n%k
n=n//k
s1=code[r]
s=s1+s
print('转换后的值为: ',s)
执行该程序段后,s的值为( A )
A.3A B.310 C.39 D.111010
【解析】 k=16,程序实现了将十进制数58转换成十六进制数,方法为除以16倒取余数,选项A正确。
变式2 有如下Python程序段:
import random
x=int(random.random()*9)*2+10
s=”
while x>0:
y=x%5
s=str(y)+s
x=x//5
print(s)
执行该程序段后,s的值不可能是( C )
A.20 B.31 C.34 D.101
【解析】 该程序实现将十进制数转换成五进制数。其中输入的十进制数为[10,26]范围内的偶数,选项A转换成十进制数为10;选项B转换成十进制数为16;选项C转换成十进制数为19,不符合随机数的产生范围,选项符合题意;选项D转换成十进制数为26。
2024·东阳中学检测有如下Python 程序段:
s=”1010/1100/1111”
ans,t=0,0
for i in s:
if ”0”<=i<=”1”:
t=t * 2+int(i)
else:
ans+=t
t=0
print(ans)
执行该程序段后,输出的结果是( C )
A.12 B.15 C.22 D.37
【解析】 将三组二进制数分别转换成十进制数,并累加到ans中,由于在else中执行累加,最后一组二进制数后没有非数字字符,故不会执行累加,ans=10+12=22,选项C正确。
变式1 有如下Python程序段:
s='1B2';ans=0;n=len(s)
for i in s:
if '0'<=i<='9':
ans=ans*16+int(i)
if 'A'<=i<='F':
ans=ans*16+ord(i)-55
print(ans)
执行该程序段后,输出的结果是( B )
A.428 B.434 C.439 D.450
【解析】 该程序实现将十六进制数转换为十进制数。1B2H=2×1+11×16+1×256=434D,选项B正确。
变式2 2024·艾青中学检测有如下Python程序段:
a=input('输入小写字母组成的字符串: ')
for i in a:
n=ord(i)+1 #字母a的ASCII码为97
h=''
for j in range(8):
h=str(abs(n%2-1))+h
n=n//2
print(h,end=' ')
若输入小写字母“ab”,则执行该程序段后,输出的结果是( C )
A.0011101 0011100 B.1100010 0011100
C.10011101 10011100 D.00011101 00011100
【解析】 将字母的ASCII值加1后,分别转化成8位二进制,由语句“abs(n%2-1)”可知,将每一位上的二进制值反相,选项C正确。
有如下Python 函数:
def trans(num,n):
s=”0123456789ABCDEF”
if num<n:
return s[num]
else:
return trans(num//n,n)+s[num%n]
执行语句“a=trans(394,16)”后,a 的值为( D )
A.19A B.1810 C.180 D.18A
【解析】 该函数的功能是将十进制数num转换成n进制数。394转换成十六进制数为18AH,选项D正确。
小明编写了一个将二进制数转换为十六进制数的Python程序。输入二进制数,输出对应的十六进制数,程序运行界面如图所示:
请在横线处填入合适的代码。
s2='0123456789ABCDEF';s3=”
s=input('请输入待转换的二进制数: ')
i=①__len(s)__
while i>0:
if i>=4:
s1=②__s[i-4:i]__
else:
s1=s[:i]
t=0
for j in s1:
t=t*2+int(j)
s3=③__s2[t]+s3__
i=i-4
print('转换后的十六进制数为: ',s3)
【解析】 二进制数转换为十六进制数的过程为:从字符串末端开始,以每四位二进制数为一单位转换成十进制数,再转换成对应的十六进制数码,实现进制转换。i为字符串的长度,指向末端;s1中依次存放最末端的4位二进制数,t为转换后的十进制数,s3为十六进制数,将得到的字符倒序拼接。
2024·东海中学检测Base64 编码是计算机常见的一种编码方式,规则是把3 个字节(24 位)的数据按6 位一组分成4 组,然后将每组数据分别转换为十进制数,根据表1 将这些十进制数所对应的字符连接。
索引
0
1
…
24
25
26
27
…
50
51
52
53
…
60
61
62
63
字符
A
B
…
Y
Z
a
b
…
y
z
0
1
…
8
9
+
/
表1
以字符“Web”为例,如表2所示,字符“Web”对应的ASCII 编码分别是87,101,98,分别转换为8 位二进制数,按6 位为一组分组后再转换成十进制数,查找它们对应的Base64字符,得到“Web”的Base64 编码为“V2Vi”。
文本
W
e
b
ASCII编码
87
101
98
二进制数
0
1
0
1
0
1
1
1
0
1
1
0
0
1
0
1
0
1
1
0
0
0
1
0
索引
21
54
21
34
Base64编码
V
2
V
i
表2
编写一个Python 程序,实现上述功能。执行该程序后,输入若干个字符(ASCII 码,个数必须是3 的倍数),输出Base64 编码。
请回答下列问题。
(1)字符“Wea”的Base64 编码为__V2Vh__。
(2)实现上述功能的Python 代码如下,请在横线处填入合适的代码。
s1=input(”请输入编码字符: ”)
tmp=0;s=””;ans=””
Base64=”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
for x in s1:
n=①__ord(x)__
t=””
for i in range(8): # 将十进制数n 转换成8 位二进制数
r=n%2
t=②__str(r)+t__
n=n//2
s=s+t
for i in range(len(s)):# 以6 位二进制数为一组转换成十进制数,查找对应的Base64编码字符
tmp=③__tmp__*__2+int(s[i])__或tmp*2+ord(s[i])-ord('O')__
if i%6==5:
ans=ans+Base64[tmp]
tmp=0
print(”Base64 编码: ”,ans)
【解析】 (1)“Wea”对应的ASCII编码分别是87,101,97,分别转换为8位二进制数为01010111,01100101,01100001,按6位为一组分为“010101,110110,010101,100001”,转换成十进制分别为21,54,21,33,对应的Base64字符为V2Vh。
(2)先将s1中的每个字符转换成ASCII码值,再转换成二进制数,并依次相连;再从左向右,每次取6位转换为十进制数,然后在字符串Base64中按位置找到Base64字符。
变式 在计算机进行加密或解密过程中,经常会对字符串进行移位等变换操作。某字符串的变换规则描述如下:
①输入的字符为十六进制数(英文字母大写,确保输入的个数为3的倍数),如4AC;
②字符串中的每个字符转成四位二进制数,按序拼接,如010010101100;
③二进制字符串每4位进行前后倒置(即4位数左右倒置) 操作,如001001010011;
④将倒置后的字符串每3位二进制数转换成1位十进制数,按序拼接后输出该十进制字符串。
程序运行界面如下图所示:
根据该规则编写的程序如下:
Hex={”0”:”0000”,”1”:”0001”,”2”:”0010”,”3”:”0011”,”4”:”0100”,”5”:”0101”,”6”:”0110”,”7”:”0111”,”8”:”1000”,”9”:”1001”,”A”:”1010”,”B”:”1011”,”C”:”1100”,”D”:”1101”,” E”:”1110”,”F”:”1111”}
sch=input(”请输入一个十六进制数(字母大写): ”)
th=””
for k in sch:
if ”0”<=k<=”9” or ”A”<=k<=”F”:
①__th=th+Hex[k]__
ts=””
for i in range(0,②__len(th),4__):
ts+=th[i+3]+th[i+2]+th[i+1]+th[i]
tob=””
tmp=0
for i in range(len(ts)):
tmp=tmp*2+int(ts[i])
if :
tob=tob+str(tmp)
tmp=0
print(”变换后的字符串为: ”,tob)
请回答下列问题。
(1)如果输入的十六进制数为 580,那么变换后的字符串为__5020__。
(2)程序中加框处代码有误,请改正:__i%3==2或__(i+l)%3==0__。
(3)请在横线处填入合适的代码。
【解析】 (1)将十六进制数转换成二进制数,再将二进制字符串每4位进行前后倒置(即4位数左右倒置),然后将每3个二进制数转换成十进制字符,580H=10110000000B,前后倒置后为101000010000,每3个二进制数转换为十进制数,得到答案为5020。
(2)加框处判断是否达到3位数字,并进行转换。
(3)①将十六进制数转换成二进制数;②实现每4位进行前后倒置。
|随|堂|检|测|
1.实现“十进制数转k进制数”的Python程序功能为: 执行该程序时,依次输入一个十进制数num和进制数k(2<=k<=16),输出十进制数转换成k进制数的结果。程序运行界面如图所示:
实现上述功能的程序如下,请在横线处填入合适的代码。
num=int(input(”请输入一个十进制数: ”))
k=int(input(”请输入进制数k(2<=k<=16): ”))
code=”0123456789ABCDEF”
n=0
s=””
while num>=k**n:
①__n=n+1__
while num!=0: #进制转换过程
if num>=k**(n-1):
icode=num//k**(n-1)
②__s=s+code[icode]__
num=num-icode*k**(n-1)
else:
s=s+”0”
③__n=n-1__
s=s+”0”*n
print(”转换为”+str(k)+”进制数的结果是: ”,s)
【解析】 程序的作用是将十进制数转换成k进制数,第1个循环中求出“num<k**n”中的n;第2个循环将十进制数转成k进制数;例如将253D转换成八进制数,第1个循环得到n为3;第2个循环开始计算:253D=3*82+7*8+5=375O。
2.2024·普陀中学检测有一种ASCII 字符加密的算法,其加密过程如下:
①将明码中每个字符的八位二进制ASCII码(不足八位的左端补0,凑足八位)分成两段(左4位高位段,右4位低位段)。如字符“C”的二进制ASCII 码为01000011,分段后为0100,0011;
②将高位段(左边4位)左移一位,即将原第一位数码移至最后(如0100转换成1000),再转换成十六进制数(如1000转换成8);
③对低位段(右边4位)执行②同样的算法,如0011→0110→6;
④顺次连接两位十六进制数,得到该字符的密文,如“C”的密文为“86”;
⑤将每个字符的密文按明码的顺序连接。
请回答下列问题。
(1)按照加密算法,明码字符“A”的密文是__82__。
(2)用Python语言编写的程序如下,请在横线处填入合适的代码,实现程序功能。
yw=input(”请输入待加密的明文: ”)
mw=””
def dtob(n):
s=””
for i in range(4):
r=n%2
s=str(r)+s
①__n=n//2__
return s
def btoh(s): #将二进制字符转换成十六进制字符
str1=”0123456789ABCDEF”
n=0
for i in s:
n=n*2+int(i)
return ②__str1[n]__
for c in yw:
③__n=ord(c)__
g=dtob(n//16)
d=dtob(n%16)
g4=g[1:4]+g[0]
d4=d[1:4]+d[0]
④__mw+=btoh(g4)+btoh(d4)__
print(”加密后的密文为: ”,mw)
【解析】 (1)字符“A”的二进制ASCII 码为01000001,分段后为0100,0001;将左边4位左移一位并转换成十六进制数:0100→1000→8H;将右边4位左移一位并转换成十六进制数:0001→0010→2H;顺序连接两位十六进制数,得到该字符的密文,“A”的密文为“82”。
(2)语句“for c in yw”,遍历每个字符,空③提取字母,并转换为ASCII值;函数dtob()将十进制数转换成二进制数,其中“n//16”提取高4位,“n%16”提取低4位;空①去除最低位,更新n;函数btoh()将二进制数转换成十六进制数,空②返回十六进制值;空④将两段二进制数转换成十六进制数并顺序连接。
温馨提示:请完成高效作业12 )
学科网(北京)股份有限公司
$$