NYOJ-520 最大素因子【数论】
2012-04-09 09:58
344 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=520
解题思路:
简单的模拟题,有2种思路:
第一种暴力:
直接找到n的最大的素因子,然后找出最大素因子在素数表中出现的位置即可。
第二种:
在筛素数的同时进行处理,因为第二层需要更新可以整除prim[i],即当前最大素因子,所以可以在此更新。一次打表即可。
代码如下:
代码如下:
解题思路:
简单的模拟题,有2种思路:
第一种暴力:
直接找到n的最大的素因子,然后找出最大素因子在素数表中出现的位置即可。
第二种:
在筛素数的同时进行处理,因为第二层需要更新可以整除prim[i],即当前最大素因子,所以可以在此更新。一次打表即可。
代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1000010 int prim ; int ans ; void fun() { int limit = sqrt(N * 1.0); memset(prim, 0, sizeof(prim)); memset(ans, 0, sizeof(ans)); for(int i = 2; i <= limit; ++i) if(!prim[i]) for(int j = i * i; j < N; j += i) prim[j] = 1; int num = 0; for(int i = 1; i < N; ++i) if(!prim[i]) ans[i] = num++; int temp = 0; for(int i = 2; i < N; ++i) if(!prim[i]) prim[temp++] = i; } int prim_induce(int n) { if(n == 1) return 1; int maxprim = 1; for(int i = 0; prim[i] * prim[i] <= n; ++i) { if(n % prim[i] == 0) { maxprim = max(maxprim, prim[i]); while(n % prim[i] == 0) n /= prim[i]; } if(n == 1) break; } if(n != 1) return n; else return maxprim; } int main() { int n; fun(); while(~scanf("%d", &n)) printf("%d\n", ans[prim_induce(n)]); return 0; }
代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1000010 int prim ; void fun() { for(int i = 2, temp = 0; i < N; ++i) if(!prim[i]) { temp++; for(int j = i; j < N; j += i) prim[j] = temp; } } int main() { int n; fun(); while(~scanf("%d", &n)) printf("%d\n", prim ); return 0; }
相关文章推荐
- NYOJ-520 最大素因子
- NYOJ520 最大素因子
- nyoj-520-最大素因子
- NYOJ 520 最大素因子
- 最大素因子 NYOJ 520
- nyoj520最大素因子(数学)
- nyoj-520-最大素因子
- nyoj 最大素因子 520 (反着素数打表)
- nyoj520最大素因子(素数筛选法)
- HDU Largest prime factor && nyoj 520 最大素因子【素数】
- NYOJ 520 最大素因子【快速线性筛法的变形】
- NYOJ-520 最大素因子
- nyoj 520 最大素因子(打表)
- NYOJ 520(最大素因子的序数)
- NYOJ 最大素因子 南工520
- Nyoj 520 最大素因子
- nyoj 最大素因子
- NYOJ 928 小M的因子和(数论)
- NYOJ520 最大素因子
- NYOJ 520 最大素因子