您的位置:首页 > 其它

hdu 5108 Alexandra and Prime Numbers(素数)

2016-07-12 09:23 411 查看


Alexandra and Prime Numbers

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1849    Accepted Submission(s): 630


Problem Description

Alexandra has a little brother. He is new to programming. One day he is solving the following problem: Given an positive integer N, judge whether N is prime.

The problem above is quite easy, so Alexandra gave him a new task: Given a positive integer N, find the minimal positive integer M, such that N/M is prime. If such M doesn't exist, output 0.

Help him!

 

Input

There are multiple test cases (no more than 1,000). Each case contains only one positive integer N.
N≤1,000,000,000.

Number of cases with N>1,000,000 is
no more than 100.

 

Output

For each case, output the requested M, or output 0 if no solution exists.

 

Sample Input

3
4
5
6

 

Sample Output

1
2
1
2

题意:给你n,求一个最小的m使得n/m为素数

思路:先存下100000以内的素数判定,然后每次只要i~[1,sqrt(n)]如果n/i为素数,那么结果为i

如果i为素数,而且1~sqrt(n)没有素数,那么结果就是n/(1~sqrt(n)中最大的素数)

如果两个都不满足,那么不存在,结果为0

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 100000
int notprime
;
void init()
{
memset(notprime,0,sizeof(notprime));
long long cnt=0;
notprime[0]=notprime[1]=1;
for(long long i=2;i*i<=1000000000;i++)
{
if(notprime[i]) continue;
for(long long j=i*i;j*j<=1000000000;j+=i)
notprime[j]=1;
}
}
long long judge(long long m)
{
if(m==1) return 0;
for(long long i=2;i*i<=m;i++)
if(m%i==0)
return 0;
return 1;
}
int main()
{
init();
long long n;
while(~scanf("%lld",&n))
{
long long now=-1,flag=0;
for(long long i=1;i*i<=n;i++)
{
if(n%i!=0) continue;
if(!notprime[i]) now=i;
if(judge(n/i)){
flag=1;
now=i;
break;
}
}
if(flag) printf("%lld\n",now);
else if(!flag&&now==-1) printf("0\n");
else printf("%lld\n",n/now);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: