鱼C论坛

 找回密码
 立即注册
查看: 1899|回复: 5

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

[复制链接]
发表于 2023-9-13 17:36:43 | 显示全部楼层 |阅读模式
50鱼币
在 “第027讲:字符串(I)| 课后测试题” 中,

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

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

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


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


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

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


a1b2c3d4e5f6g7h8i9j10k11l12m13n14o15p16q17r18s19t20u21v22w23x24y25z26

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

最佳答案
2023-9-13 17:36:44
在转换奇数下标的数字时,需要将其转换为相对于上一个字母偏移后的字母。偏移量可以通过当前数字对 26 取余数得到,因为字母表中只有 26 个字母。例如,对于数字 3,偏移量为 3 % 26 = 3,即向后偏移 3 个字母。对于数字 28,偏移量为 28 % 26 = 2,即向后偏移 2 个字母,从 z 开始往后数两个字母,即为 b。因此,使用对 26 取余数的方法可以防止溢出循环计算偏移。
Snipaste_2023-09-13_17-11-50.jpg

最佳答案

查看完整内容

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

评分

参与人数 1荣誉 +1 收起 理由
JasonChencCjj + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-13 17:36:44 | 显示全部楼层    本楼为最佳答案   
在转换奇数下标的数字时,需要将其转换为相对于上一个字母偏移后的字母。偏移量可以通过当前数字对 26 取余数得到,因为字母表中只有 26 个字母。例如,对于数字 3,偏移量为 3 % 26 = 3,即向后偏移 3 个字母。对于数字 28,偏移量为 28 % 26 = 2,即向后偏移 2 个字母,从 z 开始往后数两个字母,即为 b。因此,使用对 26 取余数的方法可以防止溢出循环计算偏移。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-13 17:46:39 | 显示全部楼层

点评

我很赞同!: 5.0
我很赞同!: 5
收到了  发表于 2023-9-13 17:58
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i]) - base 操作得到一个字母的偏移值,比如 b 就是 1
    # 跟 26 求余数的作用是防止溢出,循环计算偏移
    shift = chr((ord(s[i]) - base + int(s[i+1])) % 26 + base)
    print(s[i]+shift, end="")
shift = chr((ord(s[i]) - base + int(s[i+1])) % 26 + base)      代码这里有问题

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

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
elevenworld + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

偏移数字最大不是只能到9吗?是10的话 就是两个字符了。。。怎么 会出现 数字28
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表