除法

除法
题目描述:
小W在学除法!
现在,小W手头上有一个数字n,他每次可以进行下列三种操作中的一种:
    1.如果n整除2,让n除以2。
    2.如果n整除3,让n除以3后再乘2。
    3.如果n整除5,让n除以5之后再乘6。
小W好奇的是,这个数可以被若干次操作后变为1吗?如果可以,最少需要操作几次呢?

为了防止你随便猜一个答案糊弄小W,小W准备了很多问题来问你。

输入格式输入的第一行为一个正整数T,表示问题个数。接下来T行,每行一个正整数n,表示一个问题。

输出格式输出共T行,对于每个问题,若不能操作得到1,则输出−1;否则输出最少的操作次数。
样例输入:
7
71
710
25
30
14
27
1000000000000000000

我们可以先把2、3操作看作只除以3,只除以5,那么我们可以发现如果n能被操作成1的话n=2^a*3^b*5^c那么我们可以先把n因数里面的2,3,5除掉:

while(n%2==0) a++,n/=2;
while(n%3==0) b++,n/=3;
while(n%5==0) c++,n/=5;            

但是我们只是假设2、3操作没有副作用,那么接下来要来解决副作用

1操作没有副作用,1*a

2操作会*2 我们用1操作解决,2*b

3操作会*6拿2、3操作来解决,4*c

如果以上程序执行完了n=1 输出a+2*b+4*c

否则输出-1

程序:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    long long t,a,b,c,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        a=b=c=0;
        while(n%2==0) a++,n/=2;
        while(n%3==0) b++,n/=3;
        while(n%5==0) c++,n/=5;
        if(n==1) printf("%lld\n",a+b*2+c*4);
        else printf("-1\n");
    }
    return 0;
}

 

posted @ 2023-02-18 10:06  王浩泽  阅读(99)  评论(0编辑  收藏  举报