题目描述
发送方会发送一个4位数的整数给接收方,接收方接收后将对密码进行破解。
破解方案如下:每位数字都要加上3再除以9的余数代替该位数字,然后将第1位和第3位数字交换,第2位和第4位数字交换。
请输出破解后的密码。
输入描述:
输入一个四位数的整数。
输出描述:
输出破解后的密码,以四位数的形式。
目录
一、按位取出,分别运算
· 初始代码
num=int(input())
a=int(num/1000)
b=int((num-1000*a)/100)
c=int((num-1000*a-100*b)/10)
d=int(num-1000*a-100*b-10*c)
a=(a+3)%9
b=(b+3)%9
c=(c+3)%9
d=(d+3)%9
cc=a
aa=c
bb=d
dd=b
numx=[aa,bb,cc,dd]
for i in numx:
print(i,end='')
二、在原思想上改进方案
1、用循环结构代替重复运算步骤
numz=[a,b,c,d]
for i in numz:
i=(i+3)%9
3、交换位数
3-1 用swap函数实现
swap(numz,0,2)
swap(numz,1,3)
在运行中发现报错,经查阅了解:在Python中不使用swap()函数进行交换。
Python以引用方式管理对象,可以交换引用,但通常不能交换内存中的对象值。当然也不需要这样做。
在C++中swap()这种函数用来交换“a和b的值”。在Python中,a和b的值不会发生交换,但位于当前命名空间中的标记(如a和b)是可以交换的。而对象本身是仍然保留。
我们接下来使用:a,b = b,a 实现位数的交换
3-2 a,b = b,a
numz=[a,b,c,d]
numx=[]
for i in numz:
i=str((i+3)%9)
numx.append(i)
numz[0],numz[1]=numx[2],numx[3]
numz[2],numz[3]=numx[0],numx[1]
建立空列表numx实现运算后的暂时储存
通过 a,b = b,a 实现交换位数并储存到原列表numz
numz=[a,b,c,d]
numx=[]
for i in numz:
i=str((i+3)%9)
numx.append(i)
numz[0],numz[1]=numx[2],numx[3]
numz[2],numz[3]=numx[0],numx[1]
此处将int变量转为str目的是实现最终的整数输出而非列表输出
print(''.join(numz))
通过join函数实现将列表中字符串类型的变量提取出来
注:语法: 'sep'.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
4、现改进后完整代码
num=int(input())
a=int(num/1000)
b=int((num-1000*a)/100)
c=int((num-1000*a-100*b)/10)
d=int(num-1000*a-100*b-10*c)
numz=[a,b,c,d]
numx=[]
for i in numz:
i=str((i+3)%9)
numx.append(i)
numz[0],numz[1]=numx[2],numx[3]
numz[2],numz[3]=numx[0],numx[1]
print(''.join(numz))
5、优化提取
a=num//1000
b=(num//100)%10
c=(num//10)%10
d=num%10
6、def定义函数swap进行调换
def swapPositions(numx,i,j):
tmp=numx[i]
numx[i] =numx[j]
numx[j] =tmp
return
swapPositions(numx,0,2)
swapPositions(numx,1,3)
7、直接在输出实现调换
print(numx[2],numx[3],numx[0],numx[1],sep='')
三、省略提取步骤,直接生成字符串进行运算
num=input()
numx=str()
for i in range(len(num)):
numx=numx+str((int(num[i])+3)%9)
print(numx[2],numx[3],numx[0],numx[1],sep='')
其中
numx=numx+str((int(num[i])+3)%9)
可以用
numx+=str((int(num[i])+3)%9)
替换