我有一个在 O(end - start) 中运行的循环,我想用 O(1) 替换它。
如果“宽度”不会减少,那就很简单了。

for (int i = start; i <= end; i++, width--)
    if (i % 3 > 0) // 1 or 2, but not 0
        z += width;

开始,结束和宽度具有正值

最佳答案

正如其他人所提到的,这可能最容易被认为是两个系列的总和。

   x     x+3       x+6      ...  x+3N
 + x+3N  x+3(N-1)  x+3(N-2) ...  x
  -----------------------------------
  2x+3N 2x+3N     2x+3N     ... 2x+3N

以上可以简化为
(2x+3N)(N+1)

这意味着其中之一的总和真的是......
(2x+3N)(N+1)/2

这个方程需要应用于两个系列。两者的 N 可能不同。

因此,您所要做的就是确定您的起点以及系列中的项目数量。这将留给学生作为练习。

希望这可以帮助。

关于c - 用公式替换 for 循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2609878/

10-12 16:18