除法
除法 题目描述: 小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; }