题目:
题意:
输入一个n,问经过最少多少次操作可以使n变得最小、最小值是多少?
操作一:把n乘以一个数;
操作二:把n开平方;
思路:
把n化为质因数相乘的形式,比如一个数可以化为2^4*3^5*5^7*7^2;
找出指数最大是多少(假如是m),找到比m大且是2的指数次方的数k;
这时候就相当于把n乘以一个数变成2^k*3^k*5^k*7^k;
再对这个数一直开方变成2*3*5*7;
这样操作数最少且得到的n最小;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int book[1008611],s[1008611],k,f[1008611];
void Inint()
{
k=0;
for(int i=2;i<1008611;i++)
{
if(!book[i])
{
for(int j=2;i*j<1008611;j++)
book[i*j]=1;
}
}
for(int i=2;i<1008611;i++)
if(!book[i])
s[k++]=i;
return ;
}
int main()
{
int n;
Inint();
while(~scanf("%d",&n))
{
memset(f,0,sizeof(f));
int m=n,maxx=1,num=1,sum=0;
for(int i=0;i<k;i++)
{
int x=s[i];
if(m<=1)
break;
if(m%x==0)
num=num*x;
while(m%x==0)
{
m=m/x;
f[x]++;
}
maxx=max(maxx,f[x]);
}
if(maxx==1)
{
printf("%d 0\n",n);
continue;
}
int y=1;
while(y<maxx)
{
sum++;
y=y*2;
}
if(maxx!=y)
sum++;
else
{
for(int i=2;i<=n;i++)
{
if(f[i]&&maxx!=f[i])
{
sum++;
break;
}
}
}
printf("%d %d\n",num,sum);
}
return 0;
}