11566:Moliu Number Generator
問題文
http://uva.onlinejudge.org/external/115/11567.html
整数nが与えらるれので以下の3つの操作をして
0をnにする最小手数を求めよ。
1を足す
1を引く
2を掛ける
3つの操作でnを0にする最小手数を再帰関数で数えた。
奇数なら-1と+1をどちらも試して、偶数なら2で割るのを繰り返した。
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll rec(ll n){ if(n<4)return n; if(n%2==0)return rec(n/2)+1; return min(rec(n-1),rec(n+1))+1; } int main(void){ ll n; while(cin >> n)cout << rec(n) << endl; return 0; }