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

while循环满足条件未终止,Vigenere密码代码列表长度不一致如何修复

问题原因
  • 你代码的while循环仅在进入内层for循环前判断i < len(a)的终止条件,内层for循环遍历完整key的过程中不会做条件检查,哪怕中途i已经超过a的长度,仍然会继续往b中追加元素直到当前轮次的key遍历完成,最终导致b的长度大于a。
  • 实例验证:你提供的测试用例中,去掉空格后的明文列表a长度为19,当i=18时满足条件进入for循环,追加第一个key字符后i变为19,已经不符合终止条件,但剩下的5个key字符还是会被依次追加到b中,最终b的长度为24,和a长度不一致。
优化方案

推荐方案:取模运算实现(逻辑更简洁,无冗余判断)

直接通过下标取模的方式匹配明文和密钥长度,不需要嵌套循环:

plaintext = "This is secret message"
plaintext = plaintext.upper()
key = "secret"
key = key.upper()
def encrypt_vigenere2(key, plaintext):
    a = []
    b = []
    # 提取明文非空格字符
    for letter in plaintext:
        if letter != " ":
            a.append(letter)
    # 预处理密钥,去掉空格
    key_clean = [c for c in key if c != " "]
    key_length = len(key_clean)
    # 生成与明文等长的密钥序列
    for index in range(len(a)):
        b.append(key_clean[index % key_length])
    return a,b
print(encrypt_vigenere2(key,plaintext))

兼容原有写法的修复方案

如果要保留你原本的嵌套循环逻辑,只需要在内层每次i自增后新增终止判断,满足条件就跳出for循环即可:

plaintext = "This is secret message"
plaintext = plaintext.upper()
key = "secret"
key = key.upper()
def encrypt_vigenere2( key, plaintext ):
    a = []
    b= []
    i = 0
    for letter in (plaintext):
        if letter != " ":
            a.append(letter)
    while i<len(a):
        for element in key:
            if element != " ":
                b.append(element)
                i +=1
                # 新增终止判断,达到长度立刻跳出循环
                if i >= len(a):
                    break
    return a,b
print(encrypt_vigenere2(key,plaintext))

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:09:04