elevenworld 发表于 2023-9-13 17:36:43

关于字符串中跟26求余数防止溢出循环计算偏移的问题

在 “第027讲:字符串(I)| 课后测试题” 中,

给定的字符串 s 是按照如下规则存放的:它的偶数下标为小写英文字母,奇数下标为正整数。

题目要求:编写代码,将奇数下标的数字转换为相对于上一个字母偏移后的字母。

比如 s = "a1b2c3" 转换后的结果是 "abbdcf"(a1 -> ab,b2 -> bd,c3 -> cf);s = "x7y8z9" 转换后的结果是 "xeygzi"(遇到最后字母 z ,则从 a 继续计算偏移)


为什么要和26求余?求各位大神老师解答。


因为在“第030讲:字符串(IV)| 课后测试题”中的凯撒密文中也出现了。

为什么数字超过26,就是超出字母表范围。。。
希望能详细举例吗。感谢。

a1b2c3d4e5f6g7h8i9j10k11l12m13n14o15p16q17r18s19t20u21v22w23x24y25z26

我用这个试了下,只能计算到a1b2c3d4e5f6g7h8i9这里。到j10 就报错了

isdkz 发表于 2023-9-13 17:36:44

在转换奇数下标的数字时,需要将其转换为相对于上一个字母偏移后的字母。偏移量可以通过当前数字对 26 取余数得到,因为字母表中只有 26 个字母。例如,对于数字 3,偏移量为 3 % 26 = 3,即向后偏移 3 个字母。对于数字 28,偏移量为 28 % 26 = 2,即向后偏移 2 个字母,从 z 开始往后数两个字母,即为 b。因此,使用对 26 取余数的方法可以防止溢出循环计算偏移。

歌者文明清理员 发表于 2023-9-13 17:46:39

@yinda_peng

yinda_peng 发表于 2023-9-13 17:58:14



s = input("请按规则输入一个字符串:")
   
length = len(s)
res = []
# 获取字母 a 的编码值
base = ord('a')
   
# 从第一个元素开始,每次迭代跳过一个元素
for i in range(0, length, 2):
    # ord(s) - base 操作得到一个字母的偏移值,比如 b 就是 1
    # 跟 26 求余数的作用是防止溢出,循环计算偏移
    shift = chr((ord(s) - base + int(s)) % 26 + base)
    print(s+shift, end="")
shift = chr((ord(s) - base + int(s)) % 26 + base)      代码这里有问题

a1b2c3d4e5f6g7h8i9j10k11l12m13n14o15p16q17r18s19t20u21v22w23x24y25z26       j往后两个会是0而不是k,再往后读取ord(0) - base + int(k)就出问题了

建议一:将录入从简单的一个字符串改为将字符和数字单个单个录入到一个列表中去操作,比较简单实现,但录入麻烦
建议二:保持一个字符串录入,但遍历方面不能简单使用步长为2去判断字符还是数字,应当一步步去遍历,遍历的时候做判断,是字符还是数字,如果是字符,要继续向后遍历到下一个字符,记录遍历到的下一个字符的索引,这样得到中间的数字是两位数还是一位数再去操作

elevenworld 发表于 2023-9-13 20:47:13

isdkz 发表于 2023-9-13 17:36
在转换奇数下标的数字时,需要将其转换为相对于上一个字母偏移后的字母。偏移量可以通过当前数字对 26 取余 ...

偏移数字最大不是只能到9吗?是10的话 就是两个字符了。。。怎么 会出现 数字28
页: [1]
查看完整版本: 关于字符串中跟26求余数防止溢出循环计算偏移的问题