You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

凯撒密码实现:大移位值索引错误及字符串转整数问题求助

凯撒密码实现问题

我正在尝试实现凯撒密码,希望输入较大移位值时也能让字母表循环,不报错。但程序提示无法将字符串与数字比较,尝试用int(new_index)转换仍报错。课程老师建议把字母表列表复制两次,但我觉得对1000这类大移位值不适用。我的思路是用while循环在索引大于25时不断减25,避免多次复制列表,但代码运行出错,请问问题出在哪里?另外,我还想知道如何将被标记为字符串的字符串索引转换为整数?

附上我的代码:

def encrypt(message, shifter):
    encrypted_message = ""
    for letter in message:
        if letter == " " :
            encrypted_message += " "
        else:
            index = alphabet.index(letter)
            new_index = (alphabet[index + shifter])
            while new_index > 25:
                new_index -= 25
    print(f"The encrypted message is {encrypted_message}.")


alphabet = ['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']



text = (input("Typer your message: \n")).lower()
shift = int(input("Type your shift number: \n"))

encrypt(text, shift) 

问题分析与修复方案

1. 核心错误点

你的代码存在两个致命问题:

  • new_index = alphabet[index + shifter]这行错误地将字符元素赋值给了new_index,而非索引数字。后续while new_index > 25是拿字符串和数字做比较,必然触发类型错误。
  • 当index + shifter超过25时,直接访问alphabet[index + shifter]会触发索引越界错误,根本轮不到while循环执行。

2. 高效的循环索引计算

不需要用while循环反复减25,**取余运算%**是处理循环索引的最优解。因为字母表共26个字符,任何大数字对26取余后,结果都会落在0-25的有效索引范围内,完美适配1000这类超大移位值:

new_index = (index + shifter) % 26

3. 修复后的完整代码

def encrypt(message, shifter):
    encrypted_message = ""
    for letter in message:
        if letter == " ":
            encrypted_message += " "
        else:
            index = alphabet.index(letter)
            new_index = (index + shifter) % 26  # 取余直接得到有效索引
            encrypted_char = alphabet[new_index]  # 通过索引获取加密字符
            encrypted_message += encrypted_char  # 拼接加密字符到结果
    print(f"The encrypted message is {encrypted_message}.")


alphabet = ['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']

text = input("Type your message: \n").lower()
shift = int(input("Type your shift number: \n"))

encrypt(text, shift)

关于字符串转索引的问题

你提到的“被标记为字符串的索引”本质是混淆了字符和索引的概念:

  • 如果已经拿到了字符(比如'b'),想转成对应的索引,直接用alphabet.index(字符)即可,例如alphabet.index('b')返回1。
  • 更合理的做法是始终用数字处理索引,只在最后一步通过索引从字母表中取出对应的字符,避免混淆。

内容的提问来源于stack exchange,提问作者Niccolò Baresani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:30:58