hdu 5108 Alexandra and Prime Numbers(素数)

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.
N1,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[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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值