题目大意:每个数字都可以表示为一些素数的和,原因很显然:由算数基本定理可知,每一个数都可以表示为素数的乘积,自然也就可以表示为一些素数的和咯。

于是题目让我们求在这样的表示中出现的最大的素数是第几个素数。

思路:一开始想都没想,上了一个这样的代码。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 1000000;
 7 const int M = 100000;
 8 bool is_prime[N];
 9 int prime[M];
10 int cnt;
11
12 void sieve()
13 {
14     memset( is_prime, 1, sizeof(is_prime) );
15     is_prime[0] = is_prime[1] = 0;
16     for ( int i = 2; i < N; i++ )
17     {
18         if ( is_prime[i] )
19         {
20             int j = i * i;
21             if ( j >= N ) break;
22             while ( j < N )
23             {
24                 is_prime[j] = 0;
25                 j += i;
26             }
27         }
28     }
29     cnt = 0;
30     for ( int i = 0; i < N; i++ )
31     {
32         if ( is_prime[i] )
33         {
34             prime[cnt++] = i;
35         }
36     }
37 }
38
39 int solve( int n )
40 {
41     if ( n == 1 ) return 0;
42     int i = 0;
43     while ( prime[i] * prime[i] <= n )
44     {
45         while ( n % prime[i] == 0 )
46         {
47             n = n / prime[i];
48         }
49         i++;
50     }
51     if ( n == 1 ) return i;
52     int pos = lower_bound( prime, prime + cnt, n ) - prime;
53     return pos + 1;
54 }
55
56 int main()
57 {
58     sieve();
59     int n;
60     while ( scanf("%d", &n) != EOF )
61     {
62         printf("%d\n", solve(n));
63     }
64     return 0;
65 }

这个代码是可以过的,不过相对比较慢。

其实仔细一想,这样写更好。

 1 #include <cstring>
 2 #include <cstdio>
 3 using namespace std;
 4
 5 const int N = 1000000;
 6 int prime[N];
 7
 8 void sieve()
 9 {
10     int cnt = 0;
11     memset( prime, -1, sizeof(prime) );
12     prime[0] = prime[1] = cnt++;
13     for ( int i = 2; i < N; i++ )
14     {
15         if ( prime[i] == -1 )
16         {
17             prime[i] = cnt++;
18             for ( int j = i << 1; j < N; j += i )
19             {
20                 prime[j] = prime[i];
21             }
22         }
23     }
24 }
25
26 int main()
27 {
28     sieve();
29     int n;
30     while ( scanf("%d", &n) != EOF )
31     {
32         printf("%d\n", prime[n]);
33     }
34     return 0;
35 }

无论是空间时间还是代码总量都要优于第一个方法。

转载于:https://www.cnblogs.com/huoxiayu/p/4445624.html

hdu 2136 筛法求素数相关推荐

  1. 一般筛法求素数+快速线性筛法求素数

    一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报  分类: 算法学习资料(5)  版权声明:本文为博主原 ...

  2. CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)

    题目链接:http://codeforces.com/problemset/problem/236/B Easy Number Challenge time limit per test 2 seco ...

  3. 一般筛法和快速线性筛法求素数 求素数的一点总结

    素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...

  4. 1042: 筛法求素数

    1042: 筛法求素数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1387  Solved: 918 [Submit][Status][Web B ...

  5. 素数筛法求素数(线性时间)

    摘自:http://blog.csdn.net/once_hnu/article/details/6302283 逆向思维的典型应用! 1)普通方法判断素数:O(n*sqrt(n)) 2)筛法求素数: ...

  6. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  7. 普通素数 筛法求素数 二次筛法求素数 MillerRabin素数测试【模板】

    素数和合数共同的性质: 1.a > 1是合数,当且仅当a = b * c,其中1 < b < a,1 < c < a. 2.合数必有素数因子. 3.如果d > 1, ...

  8. 筛法求素数 (20分)

    题干: 素数是仅仅能被它本身和1整除的任何整数.筛法求素数是一种查找素数的方法.它的算法如下: 1.创建一个数组,并将所有元素初始化为1(真).具有素数下标的数组元素将保持为1,而其它数组元素最终将被 ...

  9. 筛法求素数(C语言/C++)

    什么是素数 定义 在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. C语言实现判断素数 int prime(int x) {for(int i=2;i*i<=x;i++){if ...

最新文章

  1. 浏览器允许跨域设置(不用于生产环境,开发用)
  2. DSP、ARM和单片机的区别
  3. 使用AutoMake轻松生成Makefile
  4. js基础练习---面向对象浅理解分析
  5. computed怎么使用_Vuex 基本使用
  6. UE4的MaterialInstance作用
  7. js拖拽元素到另一个元素_js控制浏览器滚动条到制定元素
  8. redis3.0 java spring_Redis-3.0.6 集群部署集成SpringJava工程-----环境搭建
  9. 【bzoj4542】[Hnoi2016]大数 莫队算法
  10. 小规模45万免税,免的是增值税,没有企业所得税!
  11. BT4中文版(集成spoonwep2/spoonwpa) 破解无线网卡非常容易
  12. 利用SolidWorks解决方案取得健身器材市场的领先地位!
  13. win7计算机如何设置密码,电脑win7怎么设置开机密码
  14. SNAT/DNAT/MASQUERADE
  15. 非聚集索引中的临界点(Tipping Point)
  16. im即时通讯开发:浅析MQTT通信协议
  17. 李福攀:Kata安全容器在蚂蚁集团的应用实践
  18. 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
  19. python map函数的作用_python语言基础之map函数,urlib.request,多线程
  20. 读《薛兆丰经济学讲义》后感

热门文章

  1. java泛型通配符和类型参数的范围
  2. Android Gradle Plugin 源码阅读与编译
  3. Linux Kernel 3.10内核源码分析--块设备层request plug/unplug机制
  4. android动态监听事件,Android-常见的事件监听
  5. C#socket之TCP开发详解(一)
  6. 风格迁移应用_[风格迁移][超分][ECCV2016]Perceptual Losses for Real...
  7. Fuzzy c-means (FCM)聚类算法
  8. 转]一个计算机专业学生几年的Java编程经验汇总
  9. 2022.2.21显示器连接器引脚信号定义1
  10. hdu4099(斐波那契数+字典树)