HDU2710 Max Factor
★★
输入:第一行为一个整数N(1 <= N <= 5,000),接下来N行每行为一个整数Ni(1<=Ni<=20000).
输出:输出这N个数中的那个数,这个数具有最大的素数因子,且这个数出现的最早。
分析:先求出1到20000之间的所有素数保存下来,然后对于每个Ni依次找到它的最大素因子即可。第二步可以优化提高效率。
AC代码(未用模板,61MS):
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int prime[20000+100],len=0;
bool vis[20000+100];
int main()
{
intm=sqrt(20000+100.5);
memset(vis,0,sizeof(vis));
for(int i=2; i<=m; i++)if(!vis[i])
{
for(int j=i*i; j<=20000; j+=i)
vis[j]=true;;
}
for(int i=2;i<=20000; i++)if(!vis[i])
prime[len++]=i;
int n;
while(scanf("%d",&n)!=EOF)
{
int max_prime=0;//最大的素因子
int p=0;//最大素因子所在的prime数组的下标
int max_num=-1;//第一个具有max_prime的数Ni
while(n--)
{
int x;
scanf("%d",&x);
if(x==1)
{
max_num=x;
max_prime=1;
continue;
}
if(max_num==-1)max_num=x;
for(int i=0; i<len; i++)//遍历小于等于X的素数
{
if(prime[i]>x)break;
if(x%prime[i]==0&&prime[i]>max_prime)
{
max_prime=prime[i];
p=i;
max_num=x;
}
}
}
printf("%d\n",max_num);
}
return 0;
}
AC代码(用模板,0MS):
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int MAXN=20000;
int prime[MAXN+1];
int getPrime()//得到小于等于MAXN的素数,prime[0]存放的是个数
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i]) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
return prime[0];
}
long long factor[100][2];
int facCnt;
int getFactors(long long x)
{//把x进行素数分解,分解成360=2^3*3^2*5^1。factor[i][0]为第i+1个素因子的值,factor[i][1]为第i+1个素因子的幂
facCnt=0;
long long tmp=x;
for(int i=1;prime[i]<=tmp/prime[i];i++)
//tmp至少为当前素数的平方才继续
{
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()
{
getPrime();
int n;
while(scanf("%d",&n)==1&&n)
{
int max_prime=0,num;
while(n--)
{
intx;
scanf("%d",&x);
if(x==1&&x>max_prime)
{
max_prime=1;
num=1;
continue;
}
getFactors(x);
if(max_prime<factor[facCnt-1][0])
{
max_prime=factor[facCnt-1][0];
num=x;
}
}
printf("%d\n",num);
}
return 0;
}