NYOJ-520 最大素因子
2014-09-24 19:14
211 查看
这个题基本上就两个知识点, 一个素数筛选法求素数,另一个是求最大公因子, 不过确定最大素数在素数表中的位置时,要用到二分的思想,不然会超时,下面是具体代码的实现;
#include <stdio.h> #include <stdlib.h> #define SIZE 1000020 int prime[SIZE];//来保存素数,从下标1开始保存第一个 int temp[SIZE];//这个是用素数筛选法求出的素数 int maxPrimeFactor(int n)//求最大素因子的函数 { int ans; for(int i = 2; i * i <= n; i ++) { while(n % i == 0) { ans = i;//如果能求余, 那么当前的i 就是一个素因子 n /= i;//将n缩小 } } if(n > 1)//此时说明n 没有被任何一个素数整除, 最大素因子的当然是他本身 ans = n; return ans; } int main() { // freopen("1.txt", "r", stdin);//利用重定向 // freopen("2.txt", "w", stdout); int N; temp[1] = 1; for(int i = 0; i < SIZE; i ++)//将整个素数表初始化 temp[i] = i; for(int i = 2; i * i< SIZE; i ++) { if(temp[i] != -1) { for(int j = i * i; j < SIZE; j += i) temp[j] = -1;//如果不是素数就将它标记为-1 } } int index = 1; for(int i = 2; i < SIZE; i ++) { if(temp[i] != -1) prime[index ++] = temp[i];//将素数表中的素数复制到prime数组中 } while(scanf("%d", &N) != EOF) { if(N == 1)//特殊数字,特别对待 { printf("0\n"); continue; } int left = 1, right = index - 1, mid = (left + right) / 2;//利用二分法确定最大素数在素数表prime中位置,如果直接for循环会超时 int maxPrime = maxPrimeFactor(N); if(maxPrime == prime[right])//此时下标不是从零开始, 所以只有两个元素时,假如要确定后一个的位置,当前这个二分不行,这个特殊情况单独写出来 { printf("%d\n", right); continue; } while(maxPrime != prime[mid]) { if(maxPrime > prime[mid]) left = mid; else right = mid; mid = (left + right) / 2; } printf("%d\n", mid);//打印下标 } return 0; }
相关文章推荐
- NYOJ-520 最大素因子【数论】
- 最大素因子 NYOJ 520
- nyoj 520 最大素因子(打表)
- nyoj520最大素因子(数学)
- NYOJ 520(最大素因子的序数)
- NYOJ520 最大素因子
- HDU Largest prime factor && nyoj 520 最大素因子【素数】
- NYOJ 520 最大素因子
- NYOJ-520 最大素因子
- nyoj 最大素因子 520 (反着素数打表)
- nyoj-520-最大素因子
- nyoj520最大素因子(素数筛选法)
- NYOJ 520 最大素因子【快速线性筛法的变形】
- nyoj-520-最大素因子
- nyoj 最大素因子
- Nyoj 520 最大素因子
- nyoj-520-最大素因子
- NYOJ520 最大素因子
- NYOJ 520 最大素因子
- nyoj 最大素因子