题目
东东在玩游戏“Game23”。
在一开始他有一个数字n,他的目标是把它转换成m,在每一步操作中,他可以将n乘以2或乘以3,他可以进行任意次操作。输出将n转换成m的操作次数,如果转换不了输出-1。
Input
输入的唯一一行包括两个整数n和m(1<=n<=m<=5*10^8).
Output
输出从n转换到m的操作次数,否则输出-1.
Simple Input 1
120 51840
Simple Output 1
7
Simple Input 2
42 42
Simple Output 2
0
Simple Input 3
48 72
Simple Output 3
1
思路
首先对m进行判断,判断m是不是n的整数倍,如果不是则直接输出-1,如果是则进行下一步判断。
使用整型变量chu记录下m是n的几倍,再对其进行处理,如果等于一则返回num;如果不是则先判断其是否为3的倍数,是则num++,chu除以三,递归进行下一层.,同理判断是否为2的倍数,如果都不是则将num赋值为-1即可。
代码
#include <iostream>
using namespace std;
typedef long long ll;
ll m, n, chu;
int num;
int solve()
{
if (chu == 1)
return num;
else
{
if (chu % 3 == 0)
{
num++;
chu /= 3;
solve();
}
else if (chu % 2 == 0)
{
num++;
chu /= 2;
solve();
}
else
{
num = -1;
return num;
}
}
}
int main()
{
while (scanf("%lld%lld",&n,&m)!=EOF)
{
num = 0;
if (m%n == 0)
{
chu = m / n;
cout << solve() << endl;
}
else
cout << -1 << endl;
}
return 0;
}