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!
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.
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
思路:先存下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[N];
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;
}