题目
东东在玩游戏“Game23”。
在一开始他有一个数字n,他的目标是把它转换成m,在每一步操作中,他可以将n乘以2或乘以3,他可以进行任意次操作。输出将n转换成m的操作次数,如果转换不了输出-1。
输入输出
Input
输入的唯一一行包括两个整数n和m(1<=n<=m<=5*10^8).
Output
输出从n转换到m的操作次数,否则输出-1.
Sample Input1
120 51840
Sample Output1
7
Sample Input2
42 42
Sample Output2
0
Sample Input3
48 72
Sample Output3
-1
思路分析
这道题思路蛮清晰的。首先m必须被n整除,否则输出-1;然后分别用两个while循环判断m能否被2或3整除,余数不为1则输出-1,否则输出转换次数。
AC代码
#include<iostream>
#include<string>
using namespace std;
int n,m;
int main()
{
scanf("%d %d",&n,&m);
int cnt=0;
if(m%n!=0){
cout<<-1<<endl;
return 0;
}
//m能除尽n,但不是n的2倍或3倍
m/=n;
int tmp;
while(m%3==0){
m/=3;
cnt++;
}
while(m%2==0){
m/=2;
cnt++;
}
if(m!=1){
cout<<-1<<endl;
return 0;
}
cout<<cnt<<endl;
return 0;
}