defKey_formatting(s, k):# 获取字符串s,删除其中的"-",并将字符串小写字母变为大写,然后将其反转
newStr = s.replace("-","").upper()[::-1]
strlen =len(newStr);# 获取字符串长度
res =""# 结果使用字符串拼接for num inrange(0, strlen, k):
res = res + newStr[num:num + k]if num + k < strlen :
res +="-"return res[::-1]
s =str(input("请输入密钥字符串S:"))
k =int(input("请输入数字:"))print(Key_formatting(s, k))
二、旋转函数
classTest02:defRotating_function(self, array):
length =len(array)
maxCount =0
tmp =0for num inrange(0, length,1):for i inrange(1, length,1):
tmp +=(i * array[(i - num + length)% length])print("F(%d) = %d"%(num, tmp))
maxCount =max(tmp, maxCount)
tmp =0print(maxCount)
test = Test02().Rotating_function([4,3,2,6])"""
num i: 0, 1, 2, 3
0: 0, 1, 2, 3
1: 3, 0, 1, 2 (i - num + length) % length
2: 2, 3, 0, 1
3: 1, 2, 3, 0
"""
三、密码宝箱
classPasswordBox:'''
初始化这个密码宝箱:
M是一个数组(原组),如果输入的M的值值符合,以M的值-1为下标的那个空间更新为1,表示这个数据(这一位)可用
'''defpasswordBox(self):
self.M =[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
self.T =int(input("输入一个T,表示有T组测试数据,(T≤500):"))
self.N =int(input("给定十进制整数N(0 ≤ N ≤ 5000) :"))
self.C =int(input("请输入数字C(2 ≤ C ≤ 16), 密码将被确定为C进制:"))print("请输入数,表示密码中含有哪些数字(1 ≤ M ≤ 16),用A来表示10, B来表示11, C来表示12 , D来表示13, E来表示14, F来表示15:");
self.M_tmp =[str(n)for n ininput("请输入一维数组,并用空格区分它:").split()]for i inrange(0,len(self.M_tmp),1):
self.M[self.strToNum(self.M_tmp[i])% self.C]=1
self.test();'''
处理测试数据:
先将字符串进行反转,从个位依次取值,如果取的值不属于规定输入的数,直接返回0,且如果不能整除N,也返回0
如果结果res != 0, 返回值,res是十进制的
'''defsystemExchange(self, strT):
tmpStr = strT[::-1]
res =0for i inrange(0,len(strT),1):
tmpNum = self.strToNum(tmpStr[i])if(self.M[tmpNum % self.C]==0):return0
res += tmpNum *pow(self.C, i)if(res % self.N !=0):return0return res
'''
处理字符数据:
将字符型的数据装换为数值型
如字符型数据范围不在规定范围之内,抛出错误
'''defstrToNum(self,str):ifstr>='0'andstr<='9':returnint(str)elifstr>='A'andstr<'F':returnord(str)-ord('A')+10elifstr>='a'andstr<'f':returnord(str)-ord('a')+10else:raise Exception('错误:str只能是0-9或者a-f或A-F。str的值为:{}'.format(str))'''
测试数据的执行方法:
根据T获取T次数据
每一次得到测试数据的结果,如果结果为0,跳过继续执行下一次循环,
如果是第一次得到结果,更新minres,
如果下次的结果比现在的minres还小,更新minres和resStr,否则不做处理
resStr是返回的结果,表示这个测试数据是符号条件的最小数据
'''deftest(self):
minres =0
isFirst =1print("请输入T组测试数据:");for i inrange(self.T):
instr =str(input("请输入测试数据:"))
tmpres = self.systemExchange(instr)if tmpres ==0:continueif isFirst ==1:
minres = tmpres
resStr = instr
isFirst =0if tmpres < minres :
minres = tmpres
resStr = instr
if(minres ==0):print("so sorry")else:print(resStr)
PasswordBox().passwordBox()'''
T : 3
N : 18
C : 8
M : 3 5
44 22
'''
classFold():deffolding(self):
charStr =str(input("请输入长度为2^k的字符串"))
reg =[int(n)for n ininput("请输入长度为k的01数组,将输入每个数以空格键隔开").split()]for i inrange(len(reg)):if reg[i]==0:
charStr = self.leftToRigth(charStr, i)elif reg[i]==1:
charStr = self.rigthToLeft(charStr, i)else:raise Exception("数组输入非法")print(charStr)return charStr
defleftToRigth(self, charStr, i):
group =pow(2, i +1)
step =len(charStr)// group
left =0
right = step
lestStr =''
rightStr =''for index inrange(pow(2, i)):
leftStr += charStr[left : right][::-1]
left = right
right = right + step
rightStr += charStr[left : right]
left = right
right = right + step
return leftStr + rightStr
defrigthToLeft(self, charStr, i):
group =pow(2, i +1)
step =len(charStr)// group
left =0
right = step
leftStr =""
rightStr =""for index inrange(pow(2, i)):
leftStr += charStr[left : right ]
left = right
right = right + step
rightStr += charStr[left : right][::-1]
left = right
right = right+ step
return rightStr + leftStr
print(Fold().folding())# print(Fold().rigthToLeft((Fold().leftToRigth("abcdefgh", 1)), 1))# print((Fold().leftToRigth("abcdefgh", 1))[:: -1])