#include<iostream>
#include<cstdio>
using namespace std
;
int main()
{
int t
;
ios
::sync_with_stdio(0);
cin
>>t
;
while(t
--){
int d
;
cin
>>d
;
int val
= d
,cnt2
=0,cnt3
=0;
while(val
%2==0)val
/=2,cnt2
++;
while(val
%3==0)val
/=3,cnt3
++;
if(val
!=1)cout
<<-1<<endl
;
else if(cnt2
>cnt3
)cout
<<-1<<endl
;
else cout
<<cnt3
+cnt3
-cnt2
<<endl
;
}
return 0;
}
题意:输入t个数,对每一个数要么乘2,要么整除6,问每一个数最小步数到1是多少步 分析:一个大于1的数转移到1一定由除6得到,那么从n变为1必须要除6,也就是除2除3,2和3是素因子,由素因子分解定理可知,一个数的素因子个数是唯一的,那么每一个数如果不断地除2除3,
如果最后得到的数为1:
说明只有2,3素因子,如果除2除3的次数相等的,那这个次数就是答案,
如果2,3次数不相等,2多3少,由于不能乘3,也就是不能增添素因子,那么这里就不能转化为更多的6所以这里是-1
如果3多2少,由于可以乘2说明可以把多余的3转化为2,所以输出cnt3-cnt2+cnt3
如果最后得到的数不为1:
如果得不到1那么也就是还有其他素因子,这个素因子不会因为乘2或者除6就能消去,所以答案是-1;
还有一种写法,就是通过打表,提前把所有6的倍数的数提前标记好然后,