/*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
*/
/*
题意:求素因子最大的数
考察:素数筛选 把x素数分解(得到的因子为全部可整除的素数)
*/
#include<stdio.h>
#include<string.h>
#define 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进行素数分解
{
facCnt=0;
long long tmp=x;
for(int i=1;tmp!=1;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++;
}
}
return facCnt;
}
int main()
{
int n;
getPrime();
int num;
while(scanf("%d",&n)!=EOF)
{
int ans=0;
int temp=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num);
if(num==1)//1的时候要单独处理一下
{
if(temp<1)
{
temp=1;
ans=1;
}
continue;
}
getFactors(num);
if(temp<factor[facCnt-1][0])
{
temp=factor[facCnt-1][0];
ans=num;
}
}
printf("%d\n",ans);
}
return 0;
}
//另一种方法
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int array[20001];
int main(){
int n;
int number;
int max,result;//最大素数因子和结果
memset(array,0,sizeof(array));
array[1]=1;
for(int i=2;i<=20000;i++){//此处素数筛法很巧妙,最后array的每个元素均为该处下标的最大因子
if(!array[i]){
for(int j=i;j<=20000;j+=i)
array[j]=i;
}
}
while(cin>>n){
max=0;
for(int i=1;i<=n;i++){
cin>>number;
if(array[number]>max){
max=array[number];
result=number;
}
}
cout<<result<<'\n';
}
return 0;
}