POJ 3048 Max Factor (筛素数)

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


题意:给你n个数,让你求出其中质因数最大的数
思路:这是筛素数的思想,在筛素数的时候,记录每个数对应的最大质因数,这样在访问该数的时候可以以o(1)的复杂度找到它所对应的最大质因数。再加上贪心的想法,在每次访问的时候找到当前最大质因数,并且记录该数。

代码如下:


 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 
 8 const int N=20010;
 9 bool a[N];
10 int ans[N];
11 
12 void isprime() //作用:找到每个数所对应的最大素数
13 {
14   int k=0;
15   memset(a,true,sizeof(a));
16   a[0]=a[1]=false;
17   for(int i=2;i<N;i++)
18   {
19     if(a[i])
20     {
21       ans[i]=i;
22       for(int j=i*2;j<N;j+=i)
23       ans[j]=i;
24 
25       a[j]=false;
26     }
27   }
28 }
29 
30 int main()
31 {
32   isprime();
33   int m;
34   while(~scanf("%d",&m))
35   {
36     int maxn=-N;
37     int x=-N;
38     while(m--)
39     {
40       int a;
41       scanf("%d",&a);
42       if(ans[a]>maxn)
43       {
44         maxn=ans[a];
45         x=a;
46       }
47     }
48     printf("%d
",x);
49   }
50   return 0;
51 }

 
原文地址:https://www.cnblogs.com/Amidgece/p/5745739.html