HDU 2710 Max Factorv (素数模板 & 多种解法)

Max Factor

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

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2412    Accepted Submission(s): 734

Problem Description
To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) cows with a distinct serial number in the range 1..20,000. Unfortunately, he is unaware that the cows interpret some serial numbers as better than others. In particular, a cow whose serial number has the highest prime factor enjoys the highest social standing among all the other cows.
(Recall that a prime number is just a number that has no divisors except for 1 and itself. The number 7 is prime while the number 6, being divisible by 2 and 3, is not).
Given a set of N (1 <= N <= 5,000) serial numbers in the range 1..20,000, determine the one that has the largest prime factor.
 
Input
* Line 1: A single integer, N
* Lines 2..N+1: The serial numbers to be tested, one per line
 
Output
* Line 1: The integer with the largest prime factor. If there are more than one, output the one that appears earliest in the input file.
 
Sample Input
 
4
36
38
40
42
 
Sample Output
 
38
 
Source
 
Recommend
teddy
 
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int N=20010;

int prime[N];
int isprime[N];

void getPrime(){    //得到小于等于 N的素数,prime[0]存放的是个数
    int i,j;
    prime[0]=0;
    for(i=0;i<N;i++)
        isprime[i]=1;
    for(i=2;i<N;i++)
        if(isprime[i]){
            prime[++prime[0]]=i;
            for(j=2;i*j<N;j++)
                isprime[i*j]=0;
        }
}

long long factor[100][2];
int facCnt;

int getFactors(long long x){    //把x进行素数分解
    facCnt=0;
    long long tmp=x;
    for(int i=1;prime[i]*prime[i]<=tmp;i++){
        factor[facCnt][1]=0;
        if(tmp%prime[i]==0){
            factor[facCnt][0]=prime[i];
            while(tmp%prime[i]==0){
                factor[facCnt][1]++;
                tmp/=prime[i];
            }
            facCnt++;
        }
    }
    if(tmp!=1){
        factor[facCnt][0]=tmp;
        factor[facCnt++][1]=1;
    }
    return facCnt;
}

int main(){

    //freopen("input.txt","r",stdin);

    getPrime();
    int n;
    while(~scanf("%d",&n)){
        int ans=1,tmp=1,num;
        for(int i=0;i<n;i++){
            scanf("%d",&num);
            if(num==1)  //1的时候要单独处理一下
                continue;
            getFactors(num);
            if(tmp<factor[facCnt-1][0]){
                tmp=factor[facCnt-1][0];
                ans=num;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

 
 
 
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int N=20000+10;

int prime[N];
int isprime[N];

void Init(){
    int i,j;
    int cnt=0;
    for(i=0;i<N;i++)
        isprime[i]=1;
    for(i=2;i<N;i++)
        if(isprime[i]){
            prime[cnt++]=i;
            for(j=2;i*j<N;j++)
                isprime[i*j]=0;
        }
}

int main(){

    //freopen("input.txt","r",stdin);

    Init();
    int n;
    while(~scanf("%d",&n)){
        int num,ans=1,max=1,tmp;
        while(n--){
            scanf("%d",&num);
            for(int i=0;prime[i]<=num;i++)
                if(num%prime[i]==0)
                    tmp=prime[i];
            if(tmp>max){
                max=tmp;
                ans=num;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

  

 

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int prime[20010];

int isPrime(int x){
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
            return 0;
    return 1;
}

int main(){

    //freopen("input.txt","r",stdin);

    memset(prime,0,sizeof(prime));
    prime[1]=1;
    for(int i=2;i<=20000;i++)
        if(isPrime(i))
            prime[i]=1;
    int n;
    while(~scanf("%d",&n)){
        int ans=1,tmp=1,max=1,res=1;
        int num;
        while(n--){
            scanf("%d",&num);
            int j=1;
            while(1){
                if(num%j==0 && prime[num/j]){
                    tmp=num/j;
                    res=num;
                    break;
                }
                j++;
            }
            if(tmp>max){
                max=tmp;
                ans=num;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int prime[20010];

void Init(){
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=20000;i++)
        if(!prime[i])
            for(int j=i*i;j<=20000;j+=i)
                prime[j]=1;
}

int main(){

    //freopen("input.txt","r",stdin);

    Init();
    int n;
    while(~scanf("%d",&n)){
        int ans=1,tmp=1,max=1,res=1;
        int num;
        while(n--){
            scanf("%d",&num);
            int j=1;
            while(1){
                if(num%j==0 && !prime[num/j]){
                    tmp=num/j;
                    res=num;
                    break;
                }
                j++;
            }
            if(tmp>max){
                max=tmp;
                ans=num;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

下面这题,哎,,被蛋疼的 2  WA了两个小时:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2093

 

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int N=1000000;

int prime[N+10],isprime[N+10];
int cnt,num[N+10];

void getPrime(){
    int i,j;
    prime[0]=0;
    for(i=0;i<N;i++)
        isprime[i]=1;
    for(i=2;i<N;i++)
        if(isprime[i]){
            prime[++prime[0]]=i;
            for(j=2;i*j<N;j++)
                isprime[i*j]=0;
        }
}

void init(){
    getPrime();
    cnt=0;
    for(int i=1;i<=prime[0];i++)
        if((prime[i]&1) && prime[i]%4==1)
            num[cnt++]=prime[i];
}

int main(){

    //freopen("input.txt","r",stdin);

    init();
    int L,U;
    while(~scanf("%d%d",&L,&U)){
        if(L==-1 && U==-1)
            break;
        int a=0,b=0;
        int l=L,u=U;
        if(L<0)
            L=0;
        if(U<0)
            U=0;
        if(L<=2 && U>=2)    //2=1*1+1*1  你懂得
            b++;
        
        for(int i=1;i<=prime[0];i++)
            if(prime[i]>=L && prime[i]<=U)
                a++;
        for(int i=0;i<cnt;i++)
            if(num[i]>=L && num[i]<=U)
                b++;
        printf("%d %d %d %d\n",l,u,a,b);
    }
    return 0;
}
View Code

 

posted @ 2012-12-28 11:00  Jack Ge  阅读(692)  评论(0编辑  收藏  举报