Description
有一天,佑子在杂志上找到了一个有趣的问题:有一个数 n,在一步中,可以将这个数乘 2,或是除以 6(如果这个数可以被 6 整除)
使数 n 变为 1 所需的最小操作数是多少。佑子找到了麻衣,想要在这个问题上一决高下,先解出这个问题的人获胜。
由于众所周知的原因,佑子无法在任何比赛中赢过麻衣,但佑子也不是输了就放弃的类型。所以麻衣为了尽早结束这地狱般的比赛,找到了热爱编程的你,并希望你帮助佑子快速解出这个问题的答案。
Input
第一行包含一个整数T,表示有T组数据(1 <= T <= 100000)
接下来T行每行包含一个整数n(1 <= n <= 1e9)
Output
输出共有 T 组,每行一个答案,表示通过给定步骤使 n 变为 1 的最小操作数(如果无法变为 1 则输出 -1)
Sample
Input
6 1 2 3 12 12345 15116544
Output
0 -1 2 -1 -1 12
Hint
第三个样例中n = 3
1、n * 2 = 6
2、n / 6 = 1
故答案为2
一个数究竟能不能只乘2而被6整除到1,被6整除必须有一个条件,那就是同时拥有因子3和2,倘若一个数3的个数小于2,那么显然只能除以3的个数个的6,剩下的必然不是1,例如数字12,只能被3整除一次12/3=4,但能被2整除两次12/2=6,6/2=3,所以不能达到要求,因为12/6=2,少一个3。但如果3的个数大于2,那么我们可以多乘2,使他们凑成一对对6。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
x = 0, y = 0;
while(n % 2 == 0)
{
n = n/2;
x ++;
}
while(n % 3 == 0)
{
n = n/3;
y ++;
}
if(n!=1 || x > y) printf("-1\n");
else printf("%d\n", y*2-x);
}
return 0;
}