在C ++中找到从零开始到达数字行中X的跳数

假设我们有一个整数X。我们必须找到从0到X所需的最小跳数。第一个跳的长度可以是一个单位,并且每个后续跳的长度将比上一个跳的长度长一个单位。每次跳跃都可以向左或向右走。因此,如果X = 8,则输出为4。0→-1→1→4→8是可能的阶段。

如果我们仔细观察,那么我们可以说

  • 如果您一直向正确的方向跳跃,那么在n次跳跃之后,您将到达p = 1 + 2 + 3 +…+ n

  • 如果我们也可以跳到左侧,则在第k次跳时,您将到达p – 2k点。

  • 如果我们仔细选择向左跳转和向右跳转,则在n次跳转之后,您可以位于n(n + 1)/ 2和–(n *(n + 1)/ 2)之间的位置,与n(n + 1)/ 2相同的奇偶校验。

示例

#include<iostream>
#include<cmath>
using namespace std;
inline int sumOneToN(int n) {
   return (n * (n + 1)) / 2;
}
int jumps(int n) {
   n = abs(n);
   int ans = 0;
   while (sumOneToN(ans) < n or (sumOneToN(ans) - n) & 1)
      ans++;
   return ans;
}
int main() {
   int n = 9;
   cout << "Number of jumps: " << jumps(n);
}

输出结果

Number of jumps: 5