这个函数(为了方便而用 C 语言编写,但这对问题并不重要)决定了数组的大小。我确信它可以转换为 if-else 链,甚至可以转换为方程,但我不够聪明,不知道如何。(我试图写下明显的 if-else 链,但在某些情况下陷入困境。)
// 0 <= from <= 0x10FFFF
// 1 <= len <= 0x10FFFF
unsigned int size_for_block(unsigned int from, unsigned int len)
{
unsigned int size = 0;
for (unsigned int i = 0; i < len; i++) {
unsigned int point = from + i;
if (0xD800 <= point && point <= 0xDFFF)
;
else if (point <= 0xFFFF)
size += 1;
else
size += 2;
}
return size;
}
如果有一种通用的、万无一失的技术可以将这种循环转换为算术,那将是一个理想的答案。如果做不到这一点,这个实例的解决方案就可以了。