• 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
  • 相关阅读:
    docker 部署 jenkins
    docker compose 常用命令
    docker compose 安装
    docker swarm 常用命令
    centos7 修改主机名
    docker 修改gwbridge ip address
    docker 创建私有镜像之 registry
    nginx 动静分离之 tomcat
    nginx lnmp之nginx+php
    nginx 配置状态监控
  • 原文地址:https://www.cnblogs.com/jackge/p/2836978.html
Copyright © 2020-2023  润新知