题目描述:
有一个正整数x,你要把x变成1,每一步你都可以选择如下两种操作的其中一种:
操作1: 变大两倍,即x=x*2。
操作2: 缩小六倍,即x=x/6,这个操作的前提是x除以6没有余数。
现在有n个问题,每个问题给出一个正整数x,问至少需要多少步,才能使得x变成1;如果永远不可能把x变成1,输出-1。
输入
第一行,一个正整数n,表示有n个问题。 1<=n<=1000。
第二行,共n个正整数,每个正整数代表一个问题的x, 其中x不超过1000000000。
输出
共n行,每行一个整数,代表回答一个问题的答案。
样例输入
7 1 2 3 12 12345 15116544 387420489
样例输出
0 -1 2 -1 -1 12 36
思路:
如果x能得到1,逆推它上一步肯定是6,再逆推一步那个数可能是3,也可能是12。那么可以得出当x!=1的时候,要得到x=1,x肯定能被3整除。因此,就让一开始输入的数,能除6就除6,不能除就乘2直到x=1或者x不能被3整除。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
int n;
for (int i=1;i<=t;i++){
cin>>n;
int ans=0;
while (n!=1){
if (n%6==0){
n=n/6;
ans++;
}else{
n=n*2;
ans++;
}
if (n==1){
break;
}
if (n%3!=0||n==0){ //因为当n=0时也能被3取余等于0,因此排除这种情况
cout<<"-1"<<endl;
break;
}
}
if (n==1){
cout<<ans<<endl;
}
}
}