我想找到比我早 7 个字符的字母表字符,所以我编写了这个函数来实现它并且工作正常:
char find7_before(char letter){
switch (letter){
case 'g':
return 'z';
break;
case 'f':
return 'y';
break;
case 'e':
return 'x';
break;
case 'd':
return 'w';
break;
case 'c':
return 'v';
break;
case 'b':
return 'u';
break;
case 'a':
return 't';
break;
default:
return (char)(((int)letter) - 7);
}
}
但我认为我可以在没有所有这些情况的情况下以更聪明的方式做到这一点,但我就是想不通! (我想出了如何以循环方式在后面找到 7 个字母)任何帮助或想法或提示? 谢谢:)
最佳答案
假设 ASCII 连续 ['a' , 'z']
...
简单的“mod 26”。
letter = ((letter - 'a' - 7) mod 26) + 'a';
然而 C 没有欧几里得模运算符。
参见 What's the difference between “mod” and “remainder”?
因此创建一个Euclidean mod 函数 - 保存以备后用。
int modulo_Euclidean(int a, int b) {
int m = a % b;
if (m < 0) {
// m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
m = (b < 0) ? m - b : m + b;
}
return m;
}
letter = modulo_Euclidean(letter - 'a' - 7, 26) + 'a';
另外,代码可以利用 'a'
的值为 97 而不是减去太多以至于 letter - ('a'%26) - 7
变为负数.
letter = (letter - ('a'%26) - 7)%26 + 'a';
迂腐的代码不会假设连续的['a' , 'z']
并执行更复杂的代码。
关于c - 如何以循环方式向下移动字母字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57650655/