HDU-5108-Alexandra and Prime Numbers

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=5108

这个题目开始想错了,开始我用素数筛选法把1000000内的素数全找出来,大于1000000的数单独判断因为大于1000000得数只有100个,

结果也超时,

看超时代码

#include<stdio.h>
#include<string.h>
#include<math.h>

int prime[1000000];

int su_shu(__int64 n)
{
__int64 k,i;
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)
return 0;
return 1;
}

int main(void)
{
memset(prime,0,sizeof(prime));
__int64 i,j;
__int64 n,k;
for(i=3; i<1000000; i++)
if(i%2==0)
prime[i]=1;
for(i=3; i<=1000; i++)
{
if(prime[i]==0)
{
for(j=i+i; j<1000000; j=j+i)
prime[j]=1;
}
}
while(scanf("%I64d",&n)==1)
{
if(n<=1000000)
{
if(prime[n]==0)
{
printf("1 ");
continue;
}
k=n/2;
for(i=2;i<=k;i++)
{
if(n%i==0)
{
if(prime[n/i]==0)
{
printf("%d ",i);
break;
}
}
}
if(i>k)
printf("0 ");
}
else
{
k=n/2;
for(i=1;i<=k;i++)
{
if(n%i==0)
{
if(su_shu(n/i))
{
printf("%d ",i);
break;
}
}
}
if(i>k)
printf("0 ");
}
}
return 0;
}

一直陷入的这种思维中,也没有想出什么好方法来

正确思维

显然N/M应该是N的最大质因子,这样才能使得M最小。暴力找到最大质因子后用N除就能算出M了。唯一无解的情况是N=1。

代码

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
using namespace std;

int main(void)
{
int n,i,j,k,t,Max;
while(scanf("%d",&n)==1)
{
if(n==1)
{
printf("0 ");
continue;
}
k=sqrt(n); t=n;
Max=1;
for(i=2;i<=k;i++)
{
while(t%i==0)
{
t=t/i;
Max=i;
}
}
Max=max(Max,t);
printf("%d ",n/Max);
}
return 0;
}

没想到啊!没想到啊!思维要转换啊!。

原文地址:https://www.cnblogs.com/liudehao/p/4116244.html