最大素因子
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
i c e最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数,例如:2的序数是1,3的序数是2,5的序数是3,以此类推. 研究数论是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0.
- 输入
- 有多组测试数据,每一行输入一个数字n.(0<n<=1000000)
- 输出
- 在接下来的一行,输出结果.
- 样例输入
-
1 2 3 4 5
- 样例输出
-
0 1 2 1 3
- 来源
- hdu改编
-
1 /*代码一 :暴力一点一点求的 。。。。华丽丽的超时了 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std; 7 8 bool num[1000001]; 9 int prime[500000]; 10 int Is_prime() 11 { 12 memset(num, true, sizeof(num)); 13 int count = 1; 14 num[0] = num[1] = false; 15 for(int i = 2; i <= 1000; ++i) 16 for(int j = i * i; j <= 1000000; j += i) 17 num[j] = false; 18 for(int i = 2; i <= 1000000; ++i) 19 if(num[i]) 20 prime[count++] = i; 21 return 0; 22 } 23 24 int main() 25 { 26 int n; 27 Is_prime(); 28 while(~scanf("%d", &n)) 29 { 30 if(n == 1) 31 { 32 printf("0\n"); 33 continue; 34 } 35 int t = 0; 36 int cnt = 1; 37 while(n >= prime[cnt]) 38 { 39 if(n % prime[cnt] == 0) 40 { 41 n /= prime[cnt]; 42 t = cnt; 43 } 44 ++cnt; 45 } 46 printf("%d\n", t); 47 } 48 return 0; 49 } 50 */ 51 52 // 代码二: 参照别人的思路,在素数筛选法中直接求结果 53 #include <cstdio> 54 #include <iostream> 55 56 using namespace std; 57 58 const int N = 1000005; 59 int ans[N]; 60 61 // 原理:因为任何数都可以分解为由全部素因子乘积的形式 62 void prime () 63 { 64 int cnt = 0; 65 for(int i = 2; i < N; i++) 66 if(ans[i] == 0) // 说明 i 是素数 67 { 68 ++cnt; // cnt 记录 素数 i 出现的序数 69 for(int j = i; j < N; j += i) 70 //素数的整倍数的最大素因子可能是该素数 71 ans[j] = cnt; 72 //更新素数对应的呈现的次序 73 } 74 } 75 76 int main() 77 { 78 prime(); 79 int num; 80 while(~scanf("%d", &num)) 81 printf("%d\n", ans[num]); 82 return 0; 83 }