python-译码(赛氪OJ)

[题目描述]
在机器学习中,现在定义一种编码规则:对于长度为 3的字符串(均由小写字母组成),首先按照字典序进行排序,即 aaa,aab,aac,…,zzz。
将这些字符串按照顺序依次从 00001 至 17575 编码(前缀 0 不可省略),即aaa=00000,aab=00001,aac=00002,…,zzz=17575 。
现在给出一串数字,请你通过计算输出这串数字对应的原字符串。(输入保证该数字长度为 5 的倍数)。
例如输入 000021757511222 ,每五位编号对应于一个字符串。
编号 00002 对应字符串 aac 。
编号 17575 对应字符串 zzz 。
编号 11222 对应字符串 qpq。
故输出为 aaczzzqpq。
输入格式:
输入共两行。
第一行为一个整数 length,代表数字串的长度。
第二行为长度为 length 的数字串。
输出格式:
输出数字串对应的原字符串。
样例输入
10
0000000001
样例输出
aaaaab
数据范围
对于 100% 的数据,保证 1≤n≤2,000,000,000。
来源/分类(难度系数:三星)
字符串 


完整代码展示:
n=int(input())
s=list(input())
m=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
def string(s):
       s.reverse()
       sum=0
       for i in range(0,len(s)):
             sum+=eval(s[i])*10**i
       a=""
       for i in range(0,26):
             for j in range(0,26):
                   for k in range(0,26):
                         if 676*i+26*j+k==sum:
                               a+=m[i]
                               a+=m[j]
                               a+=m[k]
                               break
       return a
sum=""
b=0
while b<len(s):
       c=s[b:b+5]
       sum+=string(c)
       b+=5
print(sum)


代码解释:
n=int(input())
 s=list(input())
 m=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
                                                               ”,让用户输入需破译的密码长度n,接着让用户输入该密码,将其储存在列表s中。建立一个列表m,储存a~z的26个字符。
def string(s):
      s.reverse()
      sum=0
      for i in range(0,len(s)):
            sum+=eval(s[i])*10**i
      a=""
      for i in range(0,26):
            for j in range(0,26):
                  for k in range(0,26):
                        if 676*i+26*j+k==sum:
                              a+=m[i]
                              a+=m[j]
                              a+=m[k]
                              break
       return a                           
           ”,自定义一个函数string():s作为形参,将s反转,接着令sum=0,依次遍历s中的元素,将其转换为可计算数值,sum+=eval(s[i])*10**i。建立一个空字符串a,接着遍历0~26个数字,查找676*i+26*j+k==sum的情况,并让a依次连接m[i],m[j],m[k],以break函数结束,避免重复添加。最后返回a的最终结果。
sum=""
 b=0
 while b<len(s):
         c=s[b:b+5]
         sum+=string(c)
         b+=5
 print(sum)               
”,建立一个空字符串sum,令b为循环密码字子,初始值为0,c=s[b:b+5],sum连接string(c),每循环一次,就令b+5,直至b==len(s),跳出整个while循环。打印sum的最中结果。


运行效果展示:

9b79590f3cd94ef781b89bf2556a39ca.jpg

357b0940bbee4c5da2b3f26b84936bff.jpg 

           (声明:以上内容均为原创)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闪云-微星

感谢大家的支持与鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值