签到题
东东在玩游戏“Game23”。
在一开始他有一个数字n,他的目标是把它转换成m,在每一步操作中,他可以将n乘以2或乘以3,他可以进行任意次操作。输出将n转换成m的操作次数,如果转换不了输出-1。
Input
输入的唯一一行包括两个整数n和m(1<=n<=m<=5*10^8).
Output
输出从n转换到m的操作次数,否则输出-1.
Sample Input 1
120 51840
Sample Output 1
7
Sample Input 2
42 42
Sample Output 2
0
Sample Input 3
48 72
Sample Output 3
-1
我的思路:
这道题就是要从一个数通过 乘2 或 乘3 来转换成另一个数。我的解决方法是通过递归的方法,对于每种当前状态分别进行乘2和乘3两种运算,从而形成两种新状态,通过这样的方法,不断计算,直到等到最后的结果为止(找到目标数 或 最后结果都大于目标数【即没找到】)
我的总结:
这道题相对来说比较简单,可以体现一些简单的动态规划的思想。
我的代码:
#include<iostream>
using namespace std;
int m,n;
int co(int num,int in)
{
if(num==m) return in;
if(num>m) return -1;
in++;
int in1 = co(num*2,in);
int in2 = co(num*3,in);
if(in1==-1 && in2==-1) return -1;
else return in1==-1?in2:in1;
}
int main()
{
cin>>n>>m;
cout<<co(n,0);
return 0;
}