#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e6 + 1;
int n;
int memo[MAX_N]; // 记忆化数组,存储已计算的结果
// 计算将数字rem变换到0的最少步数
int dfs(int rem) {
// 边界条件处理
if (rem < 0) return 1e9; // 无效情况,返回一个很大的值
if (rem == 0) return 0; // 已经是0,不需要步数
// 如果已经计算过,直接返回缓存的结果
if (memo[rem] != 0) return memo[rem];
int steps;
if (rem % 2 == 1) {
// 奇数只能减1
steps = dfs(rem - 1) + 1;
} else {
// 偶数可以选择减1或除以2,取最小值
steps = min(dfs(rem - 1), dfs(rem / 2)) + 1;
}
// 缓存结果并返回
return memo[rem] = steps;
}
int main() {
// 输入目标数字
cin >> n;
// 可以预初始化一些已知值以优化计算速度
memo[1] = 1; // 1 -> 0 需要1步(减1)
memo[2] = 1; // 2 -> 1 -> 0 或 2/2=1 -> 0,最少1步
// 其他值会在递归过程中自动计算
// 计算并输出结果
cout << dfs(n) << endl;
return 0;
}