gpt4 book ai didi

algorithm - 将这个循环简化为一个方程

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:46 24 4
gpt4 key购买 nike

此函数(为方便起见用 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;
}

如果有一种通用的、防白痴的技术可以将这种循环转换为算术,那将是一个理想的答案。如果做不到这一点,这个实例的解决方案就可以了。

最佳答案

首先,为简单起见:

to = from + len - 1

我认为它可以分为 3 个等式,每个“部分”。即:

  • 答:00xD800 - 1
  • 乙:0xD8000xDFFF
  • C: 0xDFFF + 1到无穷远

AC 部分“值”2,B 部分“值”1。除非我误解了您的代码 - 是否存在只有 2 个部分?

因此,将每个部分值乘以落在其中的范围的长度:

答: if (from < 0xD800) size += 2 * min((0xD800 - 1) - from + 1, len)

假设min是一个返回其参数中较小者的函数:范围是 "from 到该部分的末尾,或 len ,以较短者为准"。范围是(结束 - 开始 + 1)。

乙: if (to > 0xD800) size += 1 * min(0xDFFF - 0xD800 + 1, to - D800 + 1)

此处的逻辑类似:“完整部分,或部分的开头到 to,以较短者为准”

C: if (to > 0xDFFF + 1) size += 2 * (to - (0xDFFF + 1) + 1)

这更简单,因为没有终点:只需从头数到 to .

我不知道这对计算机来说是否更有效率。不过,这对我的大脑来说肯定效率较低。

关于algorithm - 将这个循环简化为一个方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com