c++ - 如何在循环中循环递增和递减 26 个拉丁字符
问题描述
我想增加或减少字符,但让它们循环回到a
超出时z
和z
前时a
。
例如,将“w”增加 2 得到“y”,将“w”减少 2 得到“u”。另一个示例将“w”减 28 得到“u”,将“a”减 256 得到“e”。
我已经弄清楚如何增加:char(int(A[i]+B-97)%26 +97)
其中 B 是移位量, A[i] 是当前字符。
解决方案
不要过于复杂。使用模数将增量或减量保持在 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
推荐阅读
- javascript - 仅打印负数及其和循环和数组
- php - Composer 找不到类...但找到同级文件
- c++ - 反斜杠和引号不计入字符串长度?
- kotlin - Kotlin flatmap 解压数据类列表
- python - 是否有错误的解决方案:condarc invalid yaml 和 ConfigurationLoadError: Unable to load configuration file?
- angular - 动态地将文本墙上的每个单词转换为 Angular 7 中调用角度函数的(点击) - 使用什么?
- spring - 对于 Kotlin 未经检查的异常,Spring 不会回滚事务
- r - 在R图中用具有相同长度但半高的矩形替换正方形
- angular - 将参数传递给 Angular 组件中的 getter 的替代方法
- c# - Request.Form[] 始终为空