> For the complete documentation index, see [llms.txt](https://jimmylin1991.gitbook.io/practice-of-algorithm-problems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jimmylin1991.gitbook.io/practice-of-algorithm-problems/greedy/991.-broken-calculator.md).

# 991. Broken Calculator

On a broken calculator that has a number showing on its display, we can perform two operations:

* **Double**: Multiply the number on the display by 2, or;
* **Decrement**: Subtract 1 from the number on the display.

Initially, the calculator is displaying the number `X`.

Return the minimum number of operations needed to display the number `Y`.

**Example 1:**

```
Input: X = 2, Y = 3
Output: 2
Explanation: Use double operation and then decrement operation {2 -> 4 -> 3}.
```

**Example 2:**

```
Input: X = 5, Y = 8
Output: 2
Explanation: Use decrement and then double {5 -> 4 -> 8}.
```

**Example 3:**

```
Input: X = 3, Y = 10
Output: 3
Explanation:  Use double, decrement and double {3 -> 6 -> 5 -> 10}.
```

**Example 4:**

```
Input: X = 1024, Y = 1
Output: 1023
Explanation: Use decrement operations 1023 times.
```

**Note:**

1. `1 <= X <= 10^9`
2. `1 <= Y <= 10^9`

```cpp
// Y -> X
int brokenCalc(int X, int Y) { // time: O(log(Y / X)); space: O(1)
    int res = 0;
    while (Y > X) {
        Y = (Y % 2) ? (Y + 1) : (Y / 2);
        ++res;
    }
    res += (X - Y);
    return res;
}
```

```cpp
// X -> Y
int brokenCalc(int X, int Y) { // time: O(log(Y / X)); space: O(1)
    int multiplier = 1, res = 0;
    while (X * multiplier < Y) {
        multiplier *= 2;
        ++res;
    }
    int diff = X * multiplier - Y;
    while (diff > 0) {
        res += diff / multiplier;
        diff -= diff / multiplier * multiplier;
        multiplier /= 2;
    }
    return res;
}
```
