hdu 2136 筛法求素数
题目大意:每个数字都可以表示为一些素数的和,原因很显然:由算数基本定理可知,每一个数都可以表示为素数的乘积,自然也就可以表示为一些素数的和咯。
于是题目让我们求在这样的表示中出现的最大的素数是第几个素数。
思路:一开始想都没想,上了一个这样的代码。
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 筛法求素数相关推荐
- 一般筛法求素数+快速线性筛法求素数
一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报 分类: 算法学习资料(5) 版权声明:本文为博主原 ...
- CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)
题目链接:http://codeforces.com/problemset/problem/236/B Easy Number Challenge time limit per test 2 seco ...
- 一般筛法和快速线性筛法求素数 求素数的一点总结
素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...
- 1042: 筛法求素数
1042: 筛法求素数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1387 Solved: 918 [Submit][Status][Web B ...
- 素数筛法求素数(线性时间)
摘自:http://blog.csdn.net/once_hnu/article/details/6302283 逆向思维的典型应用! 1)普通方法判断素数:O(n*sqrt(n)) 2)筛法求素数: ...
- 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验
普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...
- 普通素数 筛法求素数 二次筛法求素数 MillerRabin素数测试【模板】
素数和合数共同的性质: 1.a > 1是合数,当且仅当a = b * c,其中1 < b < a,1 < c < a. 2.合数必有素数因子. 3.如果d > 1, ...
- 筛法求素数 (20分)
题干: 素数是仅仅能被它本身和1整除的任何整数.筛法求素数是一种查找素数的方法.它的算法如下: 1.创建一个数组,并将所有元素初始化为1(真).具有素数下标的数组元素将保持为1,而其它数组元素最终将被 ...
- 筛法求素数(C语言/C++)
什么是素数 定义 在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. C语言实现判断素数 int prime(int x) {for(int i=2;i*i<=x;i++){if ...
最新文章
- 浏览器允许跨域设置(不用于生产环境,开发用)
- DSP、ARM和单片机的区别
- 使用AutoMake轻松生成Makefile
- js基础练习---面向对象浅理解分析
- computed怎么使用_Vuex 基本使用
- UE4的MaterialInstance作用
- js拖拽元素到另一个元素_js控制浏览器滚动条到制定元素
- redis3.0 java spring_Redis-3.0.6 集群部署集成SpringJava工程-----环境搭建
- 【bzoj4542】[Hnoi2016]大数 莫队算法
- 小规模45万免税,免的是增值税,没有企业所得税!
- BT4中文版(集成spoonwep2/spoonwpa) 破解无线网卡非常容易
- 利用SolidWorks解决方案取得健身器材市场的领先地位!
- win7计算机如何设置密码,电脑win7怎么设置开机密码
- SNAT/DNAT/MASQUERADE
- 非聚集索引中的临界点(Tipping Point)
- im即时通讯开发:浅析MQTT通信协议
- 李福攀:Kata安全容器在蚂蚁集团的应用实践
- 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
- python map函数的作用_python语言基础之map函数,urlib.request,多线程
- 读《薛兆丰经济学讲义》后感
热门文章
- java泛型通配符和类型参数的范围
- Android Gradle Plugin 源码阅读与编译
- Linux Kernel 3.10内核源码分析--块设备层request plug/unplug机制
- android动态监听事件,Android-常见的事件监听
- C#socket之TCP开发详解(一)
- 风格迁移应用_[风格迁移][超分][ECCV2016]Perceptual Losses for Real...
- Fuzzy c-means (FCM)聚类算法
- 转]一个计算机专业学生几年的Java编程经验汇总
- 2022.2.21显示器连接器引脚信号定义1
- hdu4099(斐波那契数+字典树)