佑子的难题

该博客介绍了一个数学问题,即如何通过每次乘2或除以6的操作将一个数变为1。文中提供了一个示例程序,解释了判断能否实现这一转换的条件,并给出了若干测试用例及其解决方案。问题的关键在于理解数字必须同时具有足够的2和3的因子才能仅通过乘2和除6达到1。
摘要由CSDN通过智能技术生成

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值