首页 > 解决方案 > 如何在循环中循环递增和递减 26 个拉丁字符

问题描述

我想增加或减少字符,但让它们循环回到a超出时zz前时a

例如,将“w”增加 2 得到“y”,将“w”减少 2 得到“u”。另一个示例将“w”减 28 得到“u”,将“a”减 256 得到“e”。

我已经弄清楚如何增加:char(int(A[i]+B-97)%26 +97)其中 B 是移位量, A[i] 是当前字符。

标签: c++

解决方案


不要过于复杂。使用模数将增量或减量保持在 26 个字符的范围内,然后简单地进行范围检查:

char cyclicIncrementDecrement(char ch, int amount)
{
    int newValue = int(ch) + (amount % 26);
    if (newValue < 'a') newValue += 26;
    if (newValue > 'z') newValue -= 26;
    return char(newValue);
}

这个方法当然假设ch已经在 to 的范围'a''z'。如果没有,您需要处理它(将其放在范围内或抛出异常或任何适合您的应用程序的东西)。

运行这个:

int main()
{
    std::cout << cyclicIncrementDecrement('w', -2) << std::endl;
    std::cout << cyclicIncrementDecrement('w', 2) << std::endl;
    std::cout << cyclicIncrementDecrement('w', -28) << std::endl;
    std::cout << cyclicIncrementDecrement('a', -256) << std::endl;
    std::cout << cyclicIncrementDecrement('z', -256) << std::endl;
    std::cout << cyclicIncrementDecrement('z', -51) << std::endl;
    std::cout << cyclicIncrementDecrement('z', -52) << std::endl;
}

给出:

u
y
u
e
d
a
z


推荐阅读